概述
本文将介紹Java虛拟機(JVM)記憶體的各個區域,了解虛拟機是怎樣使用記憶體的。
運作時資料區域
根據虛拟機規範,虛拟機所管理的記憶體将會包括以下幾個運作時資料區域,如下圖所示。
- 線程獨占:每個線程都會有它獨立的空間,随線程生命周期而建立和銷毀
- 線程共享:所有線程能通路這塊記憶體資料,随虛拟機或者GC而建立和銷毀
方法區
方法區用于存儲已被虛拟機加載的類資訊、常量、靜态變量、編譯後的代碼等資料。方法區隻是虛拟機規範重的一個邏輯區劃,具體的實作不受規範限制。如:
- HotSpot在java7中将方法區放在永久代(使用永久代實作方法區),通過GC機制進行管理
- HotSpot在java7中将方法去存儲在中繼資料空間,通過GC機制進行管理
堆記憶體
Java堆由虛拟機啟動時建立,唯一的目的就是存放對象執行個體。也因為Java堆是垃圾收集器管理的主要區域,是以很多時候也稱為“GC堆”。由于收集器采用分代收集算法,堆記憶體還可以細分為:老年代、新生代(Eden、From Survivor、To Survivor)
虛拟機棧
Java虛拟機棧是線程私有的,每一個線程都在空間有一個私有的空間,它的生命周期和線程相同。虛拟機棧描述的是Java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀。棧幀内容包含:局部變量表、操作數棧、動态連接配接、方法放回位址、附加資訊等。
本地方法棧
本地方法棧和虛拟機棧功能類似,虛拟機棧是為虛拟機執行Java方法而準備的,本地方法棧是為虛拟機使用Native本地方法而準備的。
程式計數器
為了線程線程切換後能恢複到正确的執行位置,每條線程都需要一個獨立的程式計數器,線程間互不影響。程式計數器可以看作是目前線程所執行的位元組碼的行号訓示器,記錄目前線程執行位元組碼的位置,存儲的是位元組碼指令位址,如果是Native方法,這個計數器值為空。