java中什麼樣的物件才能作為gc root物件,gc root物件有哪些

intimexy發表於2020-10-22

GC管理的主要區域是Java堆,一般情況下只針對堆進行垃圾回收。方法區、棧和本地方法區不被GC所管理,因而選擇這些區域內的物件作為GC roots,被GC roots引用的物件不被GC回收。

詳細:

GC Root

常說的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的物件,GC會收集那些不是GC roots且沒有被GC roots引用的物件。

一個物件可以屬於多個root,GC root有幾下種:

Class - 由系統類載入器(system class loader)載入的物件,這些類是不能夠被回收的,他們可以以靜態欄位的方式儲存持有其它物件。我們需要注意的一點就是,通過使用者自定義的類載入器載入的類,除非相應的java.lang.Class例項以其它的某種(或多種)方式成為roots,否則它們並不是roots。

Thread - 活著的執行緒

Stack Local - Java方法的local變數或引數

JNI Local - JNI方法的local變數或引數

JNI Global - 全域性JNI引用

Monitor Used - 用於同步的監控物件

Held by JVM - 用於JVM特殊目的由GC保留的物件,但實際上這個與JVM的實現是有關的。可能已知的一些型別是:系統類載入器、一些JVM知道的重要的異常類、一些用於處理異常的預分配物件以及一些自定義的類載入器等。然而,JVM並沒有為這些物件提供其它的資訊,因此需要去確定哪些是屬於"JVM持有"的了。

------------------------------------------------------------------------------------------------------


在Java語言裡,可作為GC Roots物件的包括如下幾種: 


a.虛擬機器棧(棧楨中的本地變數表)中的引用的物件 


b.方法區中的類靜態屬性引用的物件 


c.方法區中的常量引用的物件 


d.本地方法棧中JNI的引用的物件


相關文章