JVM 調整進入老年代的年齡

2021-09-17 20:49:41 字數 624 閱讀 9022

——長期存活物件進入老年代

虛擬機器採用分代收集的思想來管理記憶體,記憶體**時必須識別哪些物件放入新生代,哪些物件放入老年代。為了做到這點,虛擬機器為每個物件定義了乙個物件年齡計數器。

如果物件在eden出生並經過一次minor gc仍然存活,並且能被survivor容納,將被移動到survivor區,並且物件年齡設定為1.物件每經過一次minor gc後仍保持存活,年齡+1

當物件年齡到達一定程度(一般15歲),那麼它會晉公升到老年代。物件晉公升的年齡限制 -xx:maxtenuringthreshold設定

為了更好的適應不同程度的記憶體狀況,虛擬機器並不是永遠地要求物件的年齡必須到達maxtenuringthreshold才能晉公升進入老年代,當survivor中相同年齡所有物件大小總和大於survivor空間一半,年齡大於該年齡的物件直接進入老年代。

——空間分配擔保

在發生minor gc之前,虛擬機會檢查老年代最大可用的連續空間是否大於新生代所有空間總和,如果條件程離,那麼minor gc是安全的,如果不成立,則虛擬機會檢視handlepromotionfailure設定值是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用連續空間是否大於歷次晉公升到老年代物件的平均大小,如果大於則進行minor gc 否則可能進行一次full gc

JVM 物件怎麼到的老年代

jvm堆記憶體主要分為新生代和老年代,minor gc就是 新年帶的gc,也稱為young gc,老年代的gc 就是 full gc。新生代又分為eden區和兩個servivor區,這個在下面的時候可能會用到。兩個servivor區就簡稱為s1區和s2區 每次物件新生成的時候,會在eden區生成,如...

聊聊JVM分代模型 年輕代 老年代 永久代

jvm記憶體的乙個分代模型 年輕代 老年代 永久代。注 在1.8以後,永久代被移除,轉而用元空間代替。這裡主要是介紹一下概念。1.背景引入 1 package com.test.day11 23 public class testjvm 9 10private static void getstri...

優化老年代引數的分析思路

老年代優化的基調 避免物件過快進入老年代 進而思考 什麼情況物件會進入老年代?什麼情況物件會提前進入老年代?參考 什麼時候會觸發老年代gc 和 minor gc前後的幾種特殊情況 每次minor gc後,根據執行耗時 qps 每次執行產生物件大小 來計算出 存活物件的總大小,注意 suvivor 區...