AdSense

網頁

2019/7/1

Java HotSpot VM (JVM) 的Heap記憶體的劃分

Java HotSpot VM (JVM) Heap記憶體區塊的結構如下。



Java HotSpot Virtual Machine Heap Memory Structure

Java HotSpot VM,之後簡稱JVM,的Heap記憶體劃分為:

  • Young Generation(年輕世代)
  • Old Generation(老年世代)
  • Permanent Generation(永久世代)


Young Generation 年輕世代

當建立新的物件時,會先放在Young Generation區塊,當Young Generation區的空間用完時,也就是新的物件沒有空間存放時,會觸發Minor GC (Minor garbage collection)回收那些沒被指標參照的物件,也就是不再被應用程式參照的物件的記憶體空間會被回收,而經過幾次都沒被Minor GC的物件最終會移至Old Generation區。


Old Generation 老年世代

Young Generation區塊中幾次都沒被Minor GC的物件會提升(promote)至Old Generation。

Old Generation區(又稱 Tenured Generation)是用來那些存活比較久的物件。當Old Generation區需要被清理時,會觸發Major GC(Major garbage collection)。


Permanent Generation 永久世代(Java 8以前)

Permanent Generation區塊(又稱PermGen)快用來存放類別(classes)及方法(methods)的metadata,在執行期間JVM根據應用程式使用到的類別來產生所需的空間。此外Java SE函式庫的類別及方法,靜態變數參考,靜態原始型別變數及靜態方法等也是放在這個區塊。

當Permanent Generation的空間不夠存放新的類別時,那些舊的且用不到的類別資訊會被清理,這回收過程會發生在Full GC(Full garbage collection)。


不過從JDK 8開始移除了PermGem,把class metadata改存在一個新的地方叫做Metaspace,此為與JVM Heap區不連續的原生記憶體(Native memory)空間,所以Metaspace空間的上限就是系統記憶體的上限。


而Heap區會劃分成以上不同區塊的的原因是,JVM在進行GC時會發生stop-the-world影響系統效能,為了減少GC對效能的衝擊,必須對不同生命週期的物件採取不同的GC策略,而方法就是依照物件被應用程式利用的情形來決定什麼時候回收及該如何回收,因此才會劃分成以上幾種世代區塊。


沒有留言:

AdSense