眾所周知,我們目前最常用的虛擬機hotspot使用可達性分析來進行垃圾回收,而可達性分析需要依賴GC Root。下面我就來介紹下可以作為GC Root的對象。
(一)虛擬機棧中引用的對象
虛擬機棧中的引用的對象可以作為GC Root。我們程序在虛擬機的棧中執行,每次函數調用調用都是一次入棧。在棧中包括局部變量表和操作數棧,局部變量表中的變量可能為引用類型(reference),他們引用的對象即可作為GC Root。不過隨著函數調用結束出棧,這些引用便會消失。
(二)方法區中類靜態屬性引用的對象
簡單的說就是我們在類中使用的static聲明的引用類型字段,例如:
Class Dog {private static Object tail;
}
(三)方法區中常量引用的對象
簡單的說就是我們在類中使用final聲明的引用類型字段,例如:
Class Dog {private final Object tail;
}
(四)本地方法棧中引用的對象
就是程序中native本地方法引用的對象。