程序計數器
Program Counter Register
在虛擬機概念模型裏,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器完成。
線程私有,此區域是唯一一個在java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。
如果線程正在執行的是一個java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Native方法,這個計數器值則爲空(undefined)。
java虛擬機棧
Java Virtual Machine Stacks
也是線程私有的,虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
本地方法棧
Native Method Stacks
與虛擬機棧作用相似,它們的區別是本地方法棧爲虛擬機使用到的Native方法服務。
Java堆
Java Heap
Java堆是所有線程共享的一塊內存區域,此虛擬機唯一的目的就是存放對象實例,幾乎所有的對象實例都在這裏分配內存。
方法區
Method Area
方法區也是線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼數據。很多人也把方法區稱爲永久代(Permanent Generation)
這個區域的內存回收主要是針對常量池的回收和對類型的卸載。
運行時常量池
Runtime Constant Pool是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行時常量池中存放。