天天看點

JVM GC流程

  1. 對象的配置設定和回收
JVM GC流程
  • java對象優先配置設定在Eden區和一個Survivor區(Eden和Survivor的比例可以配置,比如8:1),當Eden區和Survivor區記憶體不夠對象配置設定時,觸發一次MinorGC,将Eden區和Survivor區中存活的對象移入到另一個Survivor區,并将Eden和Survivor進行回收。
  • 如果另一個Survivor區不夠裝入存活的對象時,使用配置設定擔保政策将這些對象存入老年代。
  • java大對象直接配置設定到老年代。長字元串或者大數組這類大對象會在超過設定的門檻值後直接存入老年代,避免其在Eden區頻繁地引發Minor GC,來回複制。
  • 上圖 s1 和 s2 同時隻會用其中一個塊,假如Eden+s1 進行MinorGc ,存活下的進入s2 , 下次Eden+s2 進行MinorGc ,進入s1。
  • 這裡有一概念叫做年齡門檻值,每個對象定義了年齡計數器,經過一次 Minor GC (在交換區)後年齡加1,對象年齡達到15次後将會晉升到老年代,老年代空間不夠時進行 Full GC。

  2. JVM完整的GC流程

  對象的正常流程:Eden 區 -> Survivor 區 -> 老年代。

  新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍,JVM 會“stop the world”,嚴重影響性能。

【總結】:記憶體區域不夠用了,就會引發GC。Minor GC 避免不了,Full GC 盡量避免。

【處理方式】:儲存堆棧快照日志、分析記憶體洩漏、調整記憶體設定控制垃圾回收頻率,選擇合适的垃圾回收器等。

繼續閱讀