一. 標記 - 清除演算法:
分為「標記」和 「清除」兩個階段;
方案:1.標記所有需要**的物件;
2.統一**被標記的物件;
缺點:1.效率問題,「標記」和「清除」效率都不高;
2.空間問題,被「清除」後會產生大量的不連續的記憶體碎片(當大物件找不到足夠的連續空間,就得提前gc );
二. 複製演算法:
方案:將記憶體分為兩塊,每次只使用一塊。當一塊用完時,就將還存活的物件複製到另外一塊,繼續使用另外一塊;
優化:1.無需考慮記憶體碎片等複雜情況;
2.實現簡單;
3.執行高效;
缺點:但存活物件較多時效率慢;
應用:大部分虛擬機器採用這種收集演算法來**新生代。
分為eden 和 兩塊 survivor 比例分別為 8:1:1;
新物件進入eden ,survivor用來複製存活的物件(空間不足,需要老年代分配擔保);
方案:和「標記 - 清理」演算法類似,但後續不是直接對可**物件經行清理。而是:
1.讓存活的物件先一端移動;
2.直接清理掉端邊界以外的記憶體;
優點:適用與物件存活率較高;一般適用與老年代;
四. 分代收集演算法:
方案:新生代使用:「標記 - 清理」或者 「複製」演算法;
垃圾收集演算法
首先標記出所有需要 的物件,在標記完成後統一 所有被標記的物件 將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的記憶體用完了,就將還存活著的物件複製到另外一塊上面,然後再把已使用過的記憶體空間一次清理掉。這樣使得每次都是對整個半區進行記憶體 記憶體分配時也就不用考慮記憶體碎片...
JVM (PART VI)垃圾收集演算法
標記 首先標記出要 的物件 引用計數器為0或者引用鏈不可到達 清除 標記的物件。不足 1 清除和標記兩個過程的效率都不高。2 清除之後會產生大量不連續的空間碎片。導致後期經常執行gc操作。做法 將記憶體劃分為大小相同的兩個部分,每次只使用其中的一塊,當一塊記憶體用完了,就將還存活的物件複製到另乙份上...
JVM 垃圾收集演算法
這裡只是各個演算法的思想及發展過程 這是最基礎的收集演算法,分為兩個過程,標記和清除兩個階段。首先標記出需要 的物件,在標記完成後統一 掉所有被標記的物件。標記的過程就是之前判定物件的時候標記的。後續的演算法都是基於這種思路進行改進的。缺點呢,有兩個,1.效率問題,標記和清除的效率都不高。2.空間問...