本文主要了解三種常用的垃圾收集算法:
- 標記清除-算法(Mark Sweep);
- 復制算法(Copying);
- 標記-壓縮算法(Mark-Compact);
1.標記-清除算法(Mark Sweep):
此過程分為兩個步驟:垃圾標記,垃圾清除。該算法相比於其他兩個算法:執行效率低下,還容易產生內存碎片。
但是由於老年代的生命周期比較長,使用復制清除算法操作的對象會比較多,所以老年代會使用標記清除算法。但是由於內存空間的碎片化比較嚴重大大降低了內存的使用率,因此標記壓縮算法由此而生。
2.復制算法:
復制算法廣泛的應用於新生代(由於新生代中對象的生命周期比較短暫)中,明顯的提高的GC的執行效率。當執行一次Minor GC(新生代的垃圾回收)時,Eden中存活的對象和From中之前已經經歷過一次Minor GC並且還繼續存活的對象都會被復制到to區域中,以下兩種情況對象會直接晉升到老年代中,一是當From中存活的對象的分代年齡超過閾值時會直接放進到老年代,二是當to中容量已滿放不下時,會將部分對象放進到老年代。此時,Eden和From中就只剩了垃圾對象,就可以進行垃圾清理,釋放掉其所占用的內存空間。接下來將ToSurvivor和FromSurvivor調換位置,必須保證一個Survivor空間是空的。這就是復制清除算法。
3.標記-壓縮算法:
老年代的Full GC(也叫Major GC)使用的該算法,在標記處垃圾對象后,會將存活的對象方法到一個規整並連續的內存空間中,然后執行Full GC。當Full GC執行完畢后已用的內存未用的內存之間靠一個指針維系着,該指針記錄了下一次分配的起始點的位置,下一次為新對象進行內存分配時,可使用指針碰撞法進行分配相當的便捷高效。