垃圾回收器在對堆進(jìn)行回收之前所坯,需要確定堆中哪些對象是可以繼續(xù)存活的晒骇,哪些是可以被回收的纳胧,Java采用可達(dá)性分析算法來判定對象是否可以繼續(xù)存活镰吆。
這個算法的過程是通過一系列的稱為“GC Roots”的對象作為起點,從這些起始點開始向下搜索跑慕,搜索過程中所有走過的路徑稱為引用鏈鼎姊,當(dāng)一個對象和引用鏈沒任何連接的時候,則表明這個對象是可以被回收的相赁。
可作為“GC Roots”對象的有如下幾種:
Java虛擬機(jī)棧(棧幀中的本地變量表)中引用的對象相寇;
本地方法棧中JNI(即一般說的Native方法)引用的對象;
方法區(qū)中類靜態(tài)屬性引用的對象钮科;
方法區(qū)中常量引用的對象唤衫。
還有一個用于標(biāo)識哪些對象可以被回收的算法,不過這個算法并沒有被Java語言采用绵脯,即引用計數(shù)法佳励。這個算法的過程是:給每個對象添加一個引用計數(shù)器,每當(dāng)這個對象被引用一次蛆挫,計數(shù)器加一赃承;每當(dāng)這個對象引用失效的時候,計數(shù)器減一悴侵;引用計數(shù)器為零的對象表示是可以被回收的對象瞧剖。雖然這個算法很簡單,但是它無法解決對象之間互相循環(huán)引用的問題可免,所以Java沒有采用抓于。