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