java--GC Root有哪些
阿新 • • 發佈:2018-12-05
GC管理的主要區域是Java堆,一般情況下只針對堆進行垃圾回收。方法區、JVM棧和Native棧不被GC所管理,因而選擇這些非堆區的物件作為GC roots,被GC roots引用的物件不被GC回收。
一個物件可以屬於多個root,GC root有幾下種:
- Class - 由系統類載入器(system class loader)載入的物件,這些類不可以被回收,他們可以以靜態欄位的方式持有其它物件。我們需要注意的一點就是,通過使用者自定義的類載入器載入的類,除非相應的java.lang.Class例項以其它的某種(或多種)方式成為roots,否則它們並不是roots
- Thread - 活著的執行緒
- Stack Local - Java方法的local變數或引數(存在於所有Java執行緒當前活躍的棧幀裡,它們會指向堆裡的物件)
- 【Java類的執行時常量池裡的引用型別常量(String或Class型別)】(先不考慮)
- 【String常量池(StringTable)裡的引用】(先不考慮)
- JNI Local - JNI方法的local變數或引數
- JNI Global - 全域性JNI引用
- Monitor Used - Monitor被持有,用於同步互斥的物件
- Held by JVM
GC收集那些不是GC roots且沒有被GC roots引用的物件。