1 引用計算法算法
引用計數器的實現很簡單,對於一個對象A,只要有任何一個對象引用了A,則A的引用計數器就加1。當 引用失效,計數器減1。引用計數器有兩個很是嚴重的問題性能
(1) 沒法處理循環引用spa
(2)對計數器進行加法或減法操做,影響系統性能對象
由於存在兩個嚴重的問題,因此JVM並無採用引用計數法內存
2 標記清除法效率
從根節點開始一次性標記全部可達對象,沒有被標記的就是垃圾對象。標記完成後,回收不可達對象垃圾回收
標記循環
清除引用
標記清楚算法會形成內存碎片,尤爲是大對象的內存分配,不連續的內存空間工做效率要低於連續的內存空間效率。所以這也是該算法的最大缺點im
3 複製算法
將原有的內存空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用內存塊中的存活對象複製到未使用的內存塊中,以後清除正在使用內存塊的全部對象。可是複製算法有一個明顯的缺點,就是將系統內存摺半。所以單純的複製算法很難讓人接受。
在JAVA的新生代串行垃圾回收器中,使用了複製算法思想。新生代分爲Eden空間,from空間,to空間。
大小比例爲Eden:from:to=8:1:1。在垃圾回收時,eden空間中的存活對象會被複制到未使用的to區,正在使用的from區中年輕的對象也會被複制到to空間中。大對象或者老年對象會直接進入老年代,若是to空間已滿,對象也會直接進入老年代。此時能夠清空eden和from 空間
4 標記壓縮法
先標記存活對象,把存活對象壓縮到內存一端,在進行內存碎片處理。
在這四種算法中。並無一種算法能夠代替其它算法,它們都具備本身獨特的優點和特色。所以,根據垃圾回收對象的特性,使用合適的算法,纔是明智的選擇。分代算法就是基於這種思想,它將內存空間根據對象特色分紅幾塊,根據每塊內存空間的特色,使用不一樣的回收算法,以提升垃圾的回收效率。