下面的示意圖顯示了在Java虛擬機中內存的分配和使用情況:
1. 每個線程的數據區(非共享)
每個線程的數據區包括程序計數器寄存器(Program Counter Register),Java虛擬機棧(JVM Stack),原生方法棧(Native Method Stack)。
當一個線程啓動時就會生成這三部分數據區。
程序計數器寄存器(Program Counter Register):這個不多說,學過彙編就知道,PC計數器嘛,控制程序的執行步驟
Java虛擬機棧(JVM Stack):包含了下面會提到的框架(frames)
原生方法棧(Native Method Stack):用於支持原生方法,比如非Java語言的方法
2. 所有線程共享的數據區
所有線程都共享上圖中所示的Heap和Method Area兩部分數據區
Heap:該數據區在JVM啓動後就創建,存放數組和對象,GC在該數據區工作
Method Area:該數據區存儲運行時的常量池,域和方法的數據,方法以及構造器的代碼
Runtime Constant Pool:它是在一個類文件中的常量池表的每個類或每個接口的運行時表示,包含了在編譯時已知的數字以及在運行時必須解析的域引用等幾種常量值
棧Stack包含框架Frame,當一個方法被調用的時候框架就會被推送到棧Stack中,而框架中則包含了臨時變量數組,操作數棧和常量值池的引用。