簡體   English   中英

什么是類的 GC 根?

[英]What are GC roots for classes?

在 Java 中,有稱為垃圾回收根(GC 根)的特殊對象。 它們充當垃圾收集標記機制的根對象(見圖)。

在此處輸入圖片說明

本文介紹了四種類型的 GC 根:

  • 局部變量
  • 活動線程
  • 靜態變量
  • JNI 引用

還提到:

類本身可以被垃圾收集。

不會收集 GC 根,因此類本身不是 GC 根。

那么類的 GC 根是什么?

那么類的 GC 根是什么?

類加載器,有效 - 通過其他 GC 根。

如果沒有任何東西可以到達類加載器——這意味着沒有東西可以到達由該類加載器創建的任何類或這些類的任何實例——那么類加載器和它創建的類都有資格進行垃圾收集。 在此之前讓它們保持活動狀態是必要的,以便 Class::forName 和 ClassLoader::findClass 可以是冪等的,即使類的靜態初始值設定項不是。

隱藏類(請參閱https://openjdk.java.net/jeps/371 )是此規則的例外。 作為 OpenJDK 的一個實現細節,使用 java.lang.reflect.Proxy 的靜態方法創建的方法引用、lambda 和代理的類也是如此。 類加載器沒有對這些類的強引用。

垃圾回收根是一個可以從堆外訪問的對象。

內存分析器根據以下列表對垃圾回收根進行分類:

  1. 由系統 ClassLoader 加載的類
    • JDK 類中的靜態字段(java.* 等)
  2. 實時線程
    • 堆棧 - 本地變量,方法參數
    • java.lang.Thread實例
  3. 作為同步監視器持有的對象
  4. JNI 引用
  5. JVM 特價...

來源 1 來源 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM