1. 程式人生 > >java--GC Root有哪些

java--GC Root有哪些

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
     - 用於JVM特殊目的由GC保留的物件,但實際上這個與JVM的實現是有關的。可能已知的一些型別是:系統類載入器、一些JVM知道的重要的異常類、一些用於處理異常的預分配物件以及一些自定義的類載入器等。JVM的一些靜態資料成員會指向堆裡的物件

GC收集那些不是GC roots且沒有被GC roots引用的物件。