JVM 虛擬機器 GC

HuDu發表於2020-07-16

GC

JVM 虛擬機器

JVM 在進行GC時,並不是對這三個區域統一回收,大部分回收都是在新生代

  • 新生代
  • 倖存區(from,to)
  • 老年代

GC兩種型別:輕GC(普通GC),重GC(全域性GC)

當一個物件經歷了15次GC,都沒有死就會進入養老區域
JVM設定GC老年代次數:-XX:MaxTenuringThreahold=5
透過這個引數,可以設定進入老年代的時間

JVM 虛擬機器

Eden:from:to = 8:1:1

  • JVM的記憶體模型~詳細到每個區放什麼?
  • 堆裡面的分割槽有哪些?Eden,from,to,老年區,說說特點
  • GC演算法?標記清除法,標記壓縮,複製演算法,引用計數,怎麼用
  • 輕GC和重GC分別在什麼時候發生

引用計數法:

JVM 虛擬機器

複製演算法:

是針對Eden,from和to區域及年輕代

對於from和to如何區別?
誰空誰是to

  1. 每次GC都會將Eden活著的物件移到倖存區中:一旦Eden區被GC後,就會是空的!
  2. from和to區域是互相交替的,會將from區的物件,複製到to中,然後from中就會空的。此時from就會變為to,to變為from

JVM 虛擬機器

  • 好處:沒有記憶體的碎片
  • 壞處:浪費了記憶體空間:多了一半空間永遠是空to,假設物件100%存活(極端情況)OOM
    複製演算法最佳使用場景:物件存活度較低;新生區使用

標記清除法

JVM 虛擬機器

  • 缺點:兩次掃描嚴重浪費時間,或產生碎片。
  • 優點:不需要額外的空間

標記壓縮

再最佳化:
多了移動成本
JVM 虛擬機器

##總結
記憶體效率:複製演算法>標記清除法>標記壓縮演算法(時間複雜度)
記憶體整齊度:複製演算法=標記壓縮>標記清除法
記憶體利用率:標記壓縮=標記清除>複製演算法

沒有最好的演算法,只有最合適的演算法—->GC:分代收集演算法

年輕代:

  • 存活率低:複製演算法
    老年代:
  • 區域大:存活率高
  • 標記清除+標記壓縮混合實現
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章