《深入理解Java虛擬機》筆記02 -- 垃圾收集算法
阿新 • • 發佈:2017-08-30
blog 垃圾收集 虛擬機 邊界 統一 算法 改進 其中 全部
1. 標記 - 清除算法
先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。它是最基礎的收集算法。其他收集算法都是根據其思路,改進其不足之處。
缺點:1) 標記和清除兩個階段的效率都不高;2)清除後會產一大量不連續的內存碎片
2. 復制算法
將可用內存劃分為大小相等的兩塊,每次只使用其中一塊。當一塊內存用完了,將還存活的對象復制到另一塊,然後將使用過的那塊全部清空。
缺點:可使用內存僅為分配的一半,代價太高。
這種算法主要用在新生代。新生代中大多數對象都是朝生夕死的,所以並不需要1:1來劃分,而是分為一塊較大的Eden區和兩塊較小的Survivor區,每次使用Eden和其中一塊Survivor。當回收時,將Eden和Survivor中還存活著的對象一次性地復制到另外一塊Survivor區,最後清理掉Eden和剛才用過的Survivor空間。HotSpot虛擬機默認的Eden和Survivor的大小比例是8:1。
3. 標記 - 整理算法
標記過程與“標記 - 清除”算法一樣,但後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的內存。
4. 分代收集算法
按照對象存活周期的不同,一般把Java堆分為新生代和老年代。新生代采用復制算法,老年代采用“標記 - 清理”或“標記 - 整理”算法。
《深入理解Java虛擬機》筆記02 -- 垃圾收集算法