GC
JVM 在進行GC時,並不是對這三個區域統一回收,大部分回收都是在新生代
- 新生代
- 倖存區(from,to)
- 老年代
GC兩種型別:輕GC(普通GC),重GC(全域性GC)
當一個物件經歷了15次GC,都沒有死就會進入養老區域
JVM設定GC老年代次數:-XX:MaxTenuringThreahold=5
透過這個引數,可以設定進入老年代的時間
Eden:from:to = 8:1:1
- JVM的記憶體模型~詳細到每個區放什麼?
- 堆裡面的分割槽有哪些?Eden,from,to,老年區,說說特點
- GC演算法?標記清除法,標記壓縮,複製演算法,引用計數,怎麼用
- 輕GC和重GC分別在什麼時候發生
引用計數法:
複製演算法:
是針對Eden,from和to區域及年輕代
對於from和to如何區別?
誰空誰是to
- 每次GC都會將Eden活著的物件移到倖存區中:一旦Eden區被GC後,就會是空的!
- from和to區域是互相交替的,會將from區的物件,複製到to中,然後from中就會空的。此時from就會變為to,to變為from
- 好處:沒有記憶體的碎片
- 壞處:浪費了記憶體空間:多了一半空間永遠是空to,假設物件100%存活(極端情況)OOM
複製演算法最佳使用場景:物件存活度較低;新生區使用
標記清除法
- 缺點:兩次掃描嚴重浪費時間,或產生碎片。
- 優點:不需要額外的空間
標記壓縮
再最佳化:
多了移動成本
##總結
記憶體效率:複製演算法>標記清除法>標記壓縮演算法(時間複雜度)
記憶體整齊度:複製演算法=標記壓縮>標記清除法
記憶體利用率:標記壓縮=標記清除>複製演算法
沒有最好的演算法,只有最合適的演算法—->GC:分代收集演算法
年輕代:
- 存活率低:複製演算法
老年代: - 區域大:存活率高
- 標記清除+標記壓縮混合實現
本作品採用《CC 協議》,轉載必須註明作者和本文連結