天天看點

JVM面試(五)-記憶體配置設定與回收政策對象優先在 Eden 區配置設定大對象直接進入老年代長期存活對象将進入老年代空間配置設定擔保

記憶體配置設定與回收政策

  • 對象優先在 Eden 區配置設定
  • 大對象直接進入老年代
  • 長期存活對象将進入老年代
  • 空間配置設定擔保

對象優先在 Eden 區配置設定

多數情況,對象都在新生代 Eden 區配置設定

當 Eden 區配置設定沒有足夠的空間進行配置設定時,虛拟機将會發起一次 Minor GC

如果本次 GC 後還是沒有足夠的空間,則将啟用 配置設定擔保機制 在 老年代中配置設定記憶體

Minor GC 是指發生在新生代的 GC,因為 Java 對象大多都是朝生夕死,所有 Minor GC 非常頻繁,一般回收速度也非常快

Major GC/Full GC 是指發生在老年代的 GC,出現了 Major GC 通常會伴随至少一次 Minor GC

Major GC 的速度通常會比 Minor GC 慢 10 倍以上。

大對象直接進入老年代

所謂大對象是指需要大量連續記憶體空間的對象,頻繁出現大對象是緻命的,會導緻在記憶體還有不少空間的情況下提前觸發 GC 以擷取足夠的連續空間來安置新對象

新生代使用的是标記-清除算法來處理垃圾回收的,如果大對象直接在新生代配置設定就會導緻 Eden 區和兩個 Survivor 區之間發生大量的記憶體複制

是以對于大對象都會直接在老年代進行配置設定

寫程式時應當避免出現一群“朝生夕滅”的“短命大對象”

-XX:PretenureSizeThreshold

,大于 這個設定值 的對象 直接在老年代配置設定。避免了在Eden和兩個Survivor之間發生大量的記憶體複制

長期存活對象将進入老年代

虛拟機 給每個對象 定義了一個 對象年齡計數器

當對象年齡增加到一定程度(預設是15歲),就将會被晉升到老年代中,可以通過

-XX:MaxTenuringThreshold

設定

如果在Survivor空間中 相同年齡的所有對象 的 大小總和 大于 Survivor空間的一半,年齡大于/等于該年齡的對象 就可以 直接接入老年代,這個叫動态對象年齡判定

空間配置設定擔保

在發生Minor GC之前,jvm會先檢查 老年代最大可用的連續記憶體空間 是否大于 新生代所有對象的總空間

如果擔保成立,則Minor GC是可以確定安全的

如果不成立,則jvm會檢視

HandlePromotionFailure

設定值是否允許擔保失敗

如果允許,那麼會繼續檢查老年代最大可用的連續記憶體空間 是否大于 曆次晉升到老年代對象的 平均大小

如果大于,将嘗試進行一次Minor GC

如果小于 或者HandlePromotionFailure設定不允許冒險,則要改為進行一次Full GC