通過 jstat -gcutil 來學習JVM 內存分配策略與 GC 發生時機


jstat 是 JVM 統計信息監視工具,如下:

 

我通過 jstat 來監視1192的Java進程統計信息,各項監視參數:

S0、S1 代表兩個Survivor區;

E 代表 Eden 區;

O(Old)代表老年代;

P(Permanent)代表永久代;

YGC(Young GC)代表Minor GC;

YGCT代表Minor GC耗時;

FGC(Full GC)代表Full GC耗時;

GCT代表Minor & Full GC共計耗時。

Java 堆分為新生代老年代,新生代一般划分為三塊區域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的內存比為8:1,每次只使用一個Eden 和一個 Survivor 區域,另一個 Survivor 用於復制收集算法回收內存。

對象一般盡量分配到新生代中,而對於大對象(長字符串和大數組)直接分配在老年代中,同時“年齡”長的的對象會從新生代自動晉升到老年代中。

Java 方法區稱為永久代,只有 HotSpot 虛擬機才存在永久代。

當 Eden 區域分配不足時,自動發生一次 Minor GC

當發生 Minor GC 時,虛擬機會自動檢測(比較)新生代晉升到老年代的對象內存大小和老年代剩余內存大小,如果晉升>剩余,則發生一次Full GC;如果晉升<剩余,則去檢測老年代的內存擔保 HandlePromotionFailure 是否允許擔保失敗,如果不允許擔保失敗,則發生一次Full GC,如果允許失敗,則進行一次Minor GC。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM