JVM會採用一種算法來進行GC回收,即根搜索算法。它的處理方式就是,設立若干種根對象,當任何一個根對象到某一個對象均不可達時,則認爲這個對象是可以被回收的。
就拿上圖來說,ObjectD和ObjectE是互相關聯的,但是由於GC roots到這兩個對象不可達,所以最終D和E還是會被當做GC的對象,上圖若是採用引用計數法,則A-E五個對象都不會被回收。
說到GC roots(GC根),在JAVA語言中,可以當做GC roots的對象有以下幾種:
1、虛擬機棧中的引用的對象。
2、方法區中的類靜態屬性引用的對象。
3、方法區中的常量引用的對象。
4、本地方法棧中JNI的引用的對象。
第一和第四種都是指的方法的本地變量表,第二種表達的意思比較清晰,第三種主要指的是聲明爲final的常量值。