記錄一篇 jvm內容:主要為 堆方向

zy平平仄仄發表於2024-10-12

執行時資料區:

  Java 虛擬機器在執行 Java 程式的過程中會把它管理的記憶體劃分成若干個不同的資料區域。

  根據《java虛擬機器規範》的規定,Java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區。

        

    

                 

Java堆(Java Heap):
  是虛擬機器所管理的記憶體中最大的一塊,是所有執行緒共享的一塊記憶體區域(執行緒不安全,OOM),在虛擬機器啟動時建立。
  唯一目的就是存放物件例項,幾乎所有的物件例項以及陣列都在這裡分配記憶體。
  Java堆是垃圾收集器管理的記憶體區域,因此一些資料中也稱為"GC堆"(Garbage Collected Heap)。
  由於現代垃圾收集器大部分都是採用分代收集理論設計,所以 Java 堆可以細分為:新生代(Young Generation)與老年代(Old Generation),新生代包括:Eden空間、From Survivor、To Survivor 空間等
  堆細分目的是更好地回收記憶體,或者更快地分配記憶體。

                                   --------------摘自《深入理解Java虛擬機器—JVM高階特性與最佳實踐(第三版)》

Java堆記憶體預設情況下,新生代佔1/3 ,老年代佔2/3。 新生代又把 Eden空間 8/10 、From Survivor 1/10、To Survivor 1/10

幾個關鍵詞:minorGC、majorGC、fullGC

Minor GC 主要在 年輕代(Young Generation)。

  當 Eden 區的空間被填滿時,會觸發 Minor GC。Survivor 區的滿並不會直接觸發 Minor GC。

Major GC 主要發生在老年代(Old Generation)。

  當老年代的空間不足時,會觸發 Major GC。此外,如果 Minor GC 後,從年輕代晉升到老年代的物件導致老年代空間不足,也會觸發 Major GC。

Full GC 清理整個堆記憶體(Heap),包括年輕代、老年代以及永久代(Permanent Generation,已被 Metaspace 替換)或元空間(Metaspace)。

  呼叫 System.gc() 方法時,JVM 會建議執行 Full GC,但不一定執行;當老年代空間不足時,如果沒有足夠的空間來存放 Minor GC 後晉升的物件時;透過 Minor GC 後進入老年代的平均物件大小大於老年代的可用記憶體時;當方法區(Method Area)或 Metaspace 元空間不足時;

關於年輕代內部 minor GC後的變化(動態年齡物件判斷):

  Eden 區的空間被填滿時 會觸發 minor GC , 存活的物件將進入 survivor區域。

  每觸發一次 minorGC ,survivor區 存活的物件將進行 from survivor,to survivor ( 這兩個 Survivor 區域按照順序被命名為 from 和 to)兩個區域的交替儲存並使物件的存活年齡+1。

  預設年齡最大為15 (物件記憶體佈局中Mark Word用4個bit 儲存物件分代年齡,4個bit最大 儲存 15

  當它的年齡增加到一定程度 (也就是15次 minorGC都沒被處理) 就會被晉升到老年代中。物件晉升到老年代的年齡閾值,可以透過引數 -XX:MaxTenuringThreshold 來設定。

  動態年齡物件判斷多個物件所佔空間超過survivor區50% ,某個年齡段以上的物件將被移入老年代。(一般情況都是沒有觸發15這個閾值)

    按年齡從小到大進行累積, 當累積到某個年齡,空間大小超過survivor的50%,取 這個年齡與 MaxTenuringThreshold 中最小一個值作為閾值,大於等於這個值的物件,移入老年代

===============================================================================================================================================================================================================

OOM:(OutOfMemoryError)

4bit最大能儲存的值為15‌。

4bit儲存範圍解析

  • ‌二進位制表示‌:4位二進位制數可以表示從0000到1111的所有組合。
  • ‌十進位制轉換‌:將這些二進位制數轉換為十進位制,範圍即為0(0000)到15(1111)。
  • ‌最大值確定‌:因此,4bit能夠儲存的最大十進位制數值是15。

這個結論直接基於二進位制到十進位制的轉換規則,以及二進位制數的位數決定了其能表示的最大值。

相關文章