? ? ? ? ?垃圾收集(GC):對一些死去的對象(即不可能再被任何途徑使用的對象)進(jìn)行回收招狸。
? ? ? ? 所以垃圾收集器在對堆回收之前要先確定哪些對象已經(jīng)“死去”愕够,所以這時就需要我們?nèi)チ私庀旅娴睦占惴ǎ?/p>
(1)引用計數(shù)算法
引用計數(shù)算法:給對象中添加一個引用計數(shù)器,每當(dāng)一個地方引用它時禀晓,計數(shù)器值就加1钝计;當(dāng)引用失效時茉帅,計數(shù)器值就減1;任何時刻計數(shù)器值都為0的對象就是不可能再被使用的宾添。
? ? ? ? ? ? 優(yōu)點:實現(xiàn)簡單船惨,判斷效率高
? ? ? ? ? ? 缺點:很難解決對象之間的相互循環(huán)引用的問題。
(2)根搜索算法
? ? ? ? (Java和C#都是使用根搜索算法判定對象是否存活的缕陕。)
根搜索算法:通過一系列的名為“GC Roots”的對象作為起始點粱锐,從這些結(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈扛邑,當(dāng)一個對象到GC ?Roots沒有任何引用鏈相連時怜浅,則證明此對象是不可用的。如圖,object5/6/7雖然相互有關(guān)聯(lián),但是它們到GC Roots是不可到達(dá)的周荐,所以它們將會被判定為是可回收對象。
在Java語言中奥裸,可作為GC Roots的對象包括以下幾種:
1.虛擬機(jī)棧(棧幀中的本地變量表)中的引用的對象。
2.方法區(qū)中類靜態(tài)屬性引用的對象
3.方法區(qū)中的常量引用的對象
4.本地方法棧中JNI(即一般說的native方法)的引用的對象