jvm體系結構
jvm內存分區
1 程序計數器
程序計數器是當前線程所執行字節碼的行號指示器,所以它是私有的。
如果線程執行的是非native方法,則程序計數器中保存的是當前需要執行的指令的地址;如果線程執行的是native方法,則程序計數器中的值是undefined。
程序計數器是不會發生內存溢出現象(OutOfMemory)的。
2 Java棧(Java虛擬機棧)
Java棧與線程的生命週期相同,java棧中存放的是一個個棧幀。棧幀中存放的是局部變量表、操作數棧、指向運行時常量池的引用、方法返回值地址和附加信息。也就是當jvm創建一個線程時,Java棧也隨之創建(因此它也是線程私有),線程執行一個方法時就會創建一個棧與之對應的幀並壓入棧中,方法執行結束,棧幀出棧。
局部變量表:這裏面存放的是方法中的局部變量(方法中聲明的非靜態變量以及形參和returnAddress類型)。局部變量表的大小在編譯時期就完成分配,方法運行期間大小不會改變。
3 本地方法棧
爲Native方法服務。
4 Java堆
虛擬機啓動時創建,線程共享,用於存儲數組以及對象。
(-Xmx和-Xms控制)
5 方法區(非堆)
存儲常量、靜態變量、已經被虛擬機加載的類信息(包括類的名稱、方法信息、字段信息)等。
(對應JVM內存配置中的-PermSize等)