GC Root總結


JVM根據GC Roots算法判定一個對象需要被回收,GC Roots一般在JVM的棧區域里產生。

GC Roots原理

GC Roots基本思路就是通過一系列的稱為“GC Roots”的對象作為起始點, 從這些節點開始向下搜索, 搜索所走過的路徑稱為引用鏈( Reference Chain),當一個對象到 GC Roots 沒有任何引用鏈相連( 用圖論的話來 說,就是從GC Roots到這個對象不可達)時,則證明此對象是不可用的。

GC Roots對象

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

一個對象可以屬於多個root,GC Roots有以下幾種:

  • 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持有"的了。

參考資料:GC roots

                                                <div class="ad-wrap" style="margin-top: 12px;">
                                                    <div id="blog-title-ad" data-traceid="blog_ali" data-tracepid="blogdown" style="">

                                    </div>

原文地址:https://my.oschina.net/dabird/blog/1594600


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM