運行時數據區域
jvm.png
程序計數器
程序計數器 (Program Counter Register) 是一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型(各種虛擬機可能會通過更高效的字節碼去實現)里,字節碼解釋器工作時就是通過改變這個計算器的值來選取 下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
- 每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。線程私有。
- 線程執行的是一個java方法,計數器記錄的是正在執行的虛擬機字節碼制定地址。
- 線程執行的是一個native方法,這個計數器值則為空(undefined)。
- 唯一一個不會出現OutOfMemoryError情況的區域。
java虛擬機棧
java虛擬機棧 (Java Virtual Machine Stacks) 描述的是java方法執行的內存模型,每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態連接、方法出口等。
- 線程私有,生命周期與線程相同
- 如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常
- 如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,則將拋出OutOfMemoryError異常
本地方法棧
與java虛擬機棧所發揮的作用非常相似,本地方法棧 (Native Method Stack) 是為虛擬機所使用的native方法服務。
java堆
一般來說,java堆 (Java Heap) 是java虛擬機所管理的內存最大的一塊,此區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。
- 所有線程共享的內存區域
- 垃圾收集器管理的主要區域(GC堆),還可以細分為新生代和老年代或者Eden空間、From Survivor空間和to Survivor空間
- java堆可以處于物理上不連續的內存空間中,只要邏輯上連續的即可(可通過-Xmx和-Xms控制大小)
方法區
方法區(Method Area)是用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
- 線程共享
運行時常量
運行時常量是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后進入方法區的運行時常量池中存放。