用于記錄學習
一、可達性分析算法:通過一系列的名為“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 中的對象視圖路徑
