天天看點

JVM基礎到實戰04-垃圾回收算法

上一章講了對象的存活分析,分析完對象是否存活後,我們就需要執行相應的垃圾回收過程,至于選擇哪種垃圾回收算法呢,目前主要有以下三種垃圾回收算法:

1.标記清除算法

JVM基礎到實戰04-垃圾回收算法

過程:标記--》清除

産生的問題:

1.标記和清除的過程效率都不高

2.空間問題,标記清除後會産生大量的不連續記憶體碎片,空間碎片越多會導緻以後程式在

在配置設定較大的對象實,無法找到足夠的連續記憶體二不得不提前出發一次垃圾收集動作。

2. 複制算法

JVM基礎到實戰04-垃圾回收算法

過程:分為AB兩塊記憶體,将A中存活對象記憶體複制到B中,然後将A中的全部置為空

為什麼出現?

現在的商業虛拟機都采用這種算法來回收新生代,主要是新生代中98%的對象都是朝生夕死的,

是以有大量的記憶體是需要回收的,我們隻需要移動少部分記憶體。是以并不需要按1:1來配置設定

而是将記憶體分為較大的一塊Eden和兩塊較小的Survivor空間,每次實用一塊Eden和其中一塊survivor,

survivor from 和survivor to。比例是8:1:1,

如果騰出的記憶體不夠,會用擔保配置設定算法(将對象配置設定至老年代)

缺點:複制算法在對象存活率較高時,需要複制較多的記憶體,更關鍵的是,如果不想浪費50%的

記憶體,就需要額外的空間進行配置設定擔保,以因對被使用的記憶體中所有對象都是100%存活

的極端情況,是以,老年代不能使用複制算法

3.标記整理算法

JVM基礎到實戰04-垃圾回收算法

過程:将所有存活的對象标記處來,全部整理到一端,剩下的部分記憶體全部置空