一.執行時資料區域
執行緒私有的:程式計數器+虛擬機器棧+本地方法棧
執行緒共享的:堆+方法區(執行時常量池)+直接記憶體(非執行時資料區的一部分)
*JDK1.8後將方法區廢除,新增元空間。
1.1 程式計數器
記錄指令的偏移地址,是唯一一個不會出現OutOfMemoryError的記憶體區域。
思考:為什麼不會出現OutOfMemoryError?
OutOfMemoryError出現原因是由於執行時記憶體動態擴增導致記憶體不夠用,而程式計數器是當執行到下一條指令的時候,改變的只是程式計數器中儲存的地址,不需要申請新的記憶體來儲存新的指令地址,因此,永遠不會出現OutOfMemoryError
1.2 Java虛擬機器棧
虛擬機器棧為虛擬機器執行 Java 方法 (也就是位元組碼)服務
實際上,Java虛擬機器棧是由一個個棧幀組成,而每個棧幀中都擁有:區域性變量表、運算元棧、動態連結、方法出口資訊。
區域性變量表主要存放了編譯器可知的各種資料型別、物件引用。
1.3 本地方法棧
與虛擬機器棧類似,只不過是為native方法服務
1.4 堆
垃圾收集管理(GC)的主要區域,主要存放物件例項,給物件和陣列分配記憶體
1.5 方法區(目前由元空間取代)
儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料
”永久代“用來實現方法區,使GC能像管理堆一樣管理記憶體
*JDK1.8後被元空間取代,使用直接記憶體。
1.6 執行時常量池
用於存放編譯期生成的各種字面量和符號引用,例如:String a="123"
JDK1.7後將執行時常量池從方法區中移了出來,在 堆(Heap)中指定一塊區域存放執行時常量池。
1.7 直接記憶體
不屬於JVM執行時資料區域,但也會發生OutOfMemoryError