在Java語言中,GC Root主要包括以下幾類元素:
1、虛擬機(jī)棧中引用的對(duì)象
比如:各個(gè)線程被調(diào)用的方法中使用到的參數(shù)、局部變量等。
2、本地方法棧內(nèi)JNI(通常說的本地方法)引用的對(duì)象
3、方法區(qū)中類靜態(tài)屬性引用的對(duì)象
比如:Java類的引用類型靜態(tài)變量
4、方法區(qū)中常量引用的對(duì)象
比如:字符串常量池(string Table) 里的引用
5、所有被同步鎖synchronized持有的對(duì)象
6、Java虛擬機(jī)內(nèi)部的引用。
基本數(shù)據(jù)類型對(duì)應(yīng)的Class對(duì)象,一些常駐的異常對(duì)象(如:
NullPointerException、OutOfMemoryError) ,系統(tǒng)類加載器。
7、反映java虛擬機(jī)內(nèi)部情況的JMXBean、JVMTI中注冊(cè)的回調(diào)、本地代碼緩存等
8、除了這些固定的GCRoots集合以外,根據(jù)用戶所選用的垃圾收集器以及當(dāng)前回收的內(nèi)存區(qū)域不同,還可以有其他對(duì)象“臨時(shí)性”地加入,共同構(gòu)成完整GC Roots集合。比如:分代收集和局部回收(Partial GC)。
如果只針對(duì)Java堆中的某一塊區(qū)域進(jìn)行垃圾回收(比如:典型的只針對(duì)新生代),必須考慮到內(nèi)存區(qū)域是虛擬機(jī)自己的實(shí)現(xiàn)細(xì)節(jié),更不是孤立封閉的,這個(gè)區(qū)域的對(duì)象完全有可能被其他區(qū)域的對(duì)象所引用,這時(shí)候就需要一并將關(guān)聯(lián)的區(qū)域?qū)ο笠布尤隚C Roots集
合中去考慮,才能保證可達(dá)性分析的準(zhǔn)確性。