GCRoot

用于記錄學習

一、可達性分析算法:通過一系列的名為“GC Root”的對象作為起點,從這些節(jié)點向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Root沒有任何引用鏈相連時,則該對象不可達,該對象是不可使用的,垃圾收集器將回收其所占的內(nèi)存。

? ? 在java語言中,可作為GCRoot的對象包括以下幾種:

????a. java虛擬機棧(棧幀中的本地變量表)中的引用的對象。?

????b.方法區(qū)中的類靜態(tài)屬性引用的對象。?

????c.方法區(qū)中的常量引用的對象。?

????d.本地方法棧中JNI本地方法的引用對象。

二、GC(Garbage Collector) Roots 實際上是垃圾回收器需要回收的對象。垃圾回收器回收那些不是 GC Roots 的對象并且不再被GC Roots引用的對象。

這里有幾種可以作為 GC Roots 的對象。一個對象可以屬于多種類型的 Root。有以下幾種類型的 Root 對象。

Class-通過系統(tǒng)的類加載器加載的class。這種class是不可能被卸載的。它們可以通過靜態(tài)數(shù)據(jù)域引用對象。這里需要注意的是,通過用戶自定義的類加載器加載的Class并不能作為 GC Roots,除非相應(yīng)的 java.lang.Class 的實例恰巧成為 GC Roots 對象。

Thrad-存活的線程

Stack LocalJava 方法中的變量或者方法形參

JNI Local-JNI方法中的變量或者方法形參

JNI Global-全局 JNI引用

Monitor Used-用于同步監(jiān)控的對象

Held by JVM-JVM由于一些原因會從垃圾回收器中持有一些對象的引用。實際上,這里和 JVM本身的實現(xiàn)有關(guān)。一些可能的已知原因是,系統(tǒng)的類加載器,一些jvm自身已知的異常類,一些預分配的異常處理對象,正在加載類的自定義類加載器。很不爽的是,JVM基本沒有提供額外的細節(jié)去描述這些對象。因此,這僅僅能通過分析去判斷哪些對象是所謂的 JVM持有的。

如果一個對象是一個 GC Roots 對象,在所有的視圖中它都會被特別的標記來表明它是一個獨立的對象。下面這張圖展示了一個 Fragment 中的對象視圖路徑



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容