剩余 大小 查看内存_JVM的内存分配策略以及进入分代的条件
JVM的參數(shù)和知識點太多啦,記錄下來,供自己隨時回顧。
java對象什么時候進(jìn)入年輕代(新生代)?
當(dāng)對象首次創(chuàng)建時, 會放在新生代的eden區(qū), 如果不被GC回收,會一直在eden區(qū)
java對象什么時候進(jìn)入老年代?
對象優(yōu)先在Eden分配
對象首先進(jìn)入Eden區(qū)域,Eden區(qū)域滿時會進(jìn)行一次YGC,把存活對象放入S1區(qū),再對Eden區(qū)域進(jìn)行垃圾回收。第二次Eden區(qū)域滿時進(jìn)行第二次YGC,此時S1區(qū)的存活對象和Eden的存活對象被復(fù)制到S2區(qū),Eden區(qū)的垃圾對象再次被回收
設(shè)置參數(shù):-XX:SurvivorRatio=8
設(shè)置Eden區(qū)比例為80%,S1 和 S2 各為10%;若設(shè)置為5,Eden:兩個S區(qū) 為5:1:1
大對象直接進(jìn)入老年代
為了避免對象在Eden區(qū)、S1、S2區(qū)進(jìn)行大量的內(nèi)存復(fù)制,當(dāng)大對象進(jìn)入時,直接進(jìn)入老年代。 配置參數(shù):-XX:PretenureSizeThreshold=1M 當(dāng)對象大于1M時,直接進(jìn)入老年代
空間分配擔(dān)保機(jī)制
在執(zhí)行任何Minor GC(YGC)之前,虛擬機(jī)會先檢查老年代最大可用的連續(xù)空間是否大于新生代對象總空間,如果這個條件成立,那么Minor GC可用確保是安全的,如果不成立,則虛擬機(jī)會查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗,如果允許,會繼續(xù)檢查之前歷次Minor GC中晉升到老年代的平均對象大小是否<老年代最大可用的連續(xù)空間,如果小于,將嘗試進(jìn)行一次Minor GC,這次GC是由風(fēng)險的,如果大于或者HandlePromotionFailure設(shè)置為false,那么這時要進(jìn)行一次Full GC,為可能晉升到老年代的對象騰出空間。
風(fēng)險指的是什么?指的是極端情況下MGC之后所有對象依舊存活,對象全部要進(jìn)入老年代,如果老年代空間不夠用,就會觸發(fā)一次Full GC。如果Full GC之后老年代空間還是不夠用,會觸發(fā)OOM。
這塊太繞了。。簡單一點
if(需要進(jìn)行一次Minor GC){if(老年代可用空間 > 新生代所有對象大小){執(zhí)行一次Minor GC;}else{if(-XX:-HandlePromotionFailure=true){if(老年代連續(xù)可用空間>之前晉升到老年代所有大小的平均值){執(zhí)行Minor GC;/*執(zhí)行之后有3種情況:1.剩余對象大小小于S區(qū)大小,對象進(jìn)入S區(qū)2.剩余對象大小大于S區(qū),對象進(jìn)入老年代3.剩余對象大小大于S區(qū),也大于老年代,執(zhí)行一次Full GC。如果執(zhí)行Full GC之后還是放不下晉升對象,報錯OOM*/}else{執(zhí)行Full GC;執(zhí)行Minor GC;}}}}總結(jié)
以上是生活随笔為你收集整理的剩余 大小 查看内存_JVM的内存分配策略以及进入分代的条件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 参数识别,[转载]自编最小
- 下一篇: pagehelper插件oracle,带