用于記錄學(xué)習(xí)
一、可達(dá)性分析算法:通過一系列的名為“GC Root”的對(duì)象作為起點(diǎn),從這些節(jié)點(diǎn)向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Root沒有任何引用鏈相連時(shí),則該對(duì)象不可達(dá),該對(duì)象是不可使用的,垃圾收集器將回收其所占的內(nèi)存。
? ? 在java語言中,可作為GCRoot的對(duì)象包括以下幾種:
????a. java虛擬機(jī)棧(棧幀中的本地變量表)中的引用的對(duì)象。?
????b.方法區(qū)中的類靜態(tài)屬性引用的對(duì)象。?
????c.方法區(qū)中的常量引用的對(duì)象。?
????d.本地方法棧中JNI本地方法的引用對(duì)象。
二、GC(Garbage Collector) Roots 實(shí)際上是垃圾回收器需要回收的對(duì)象。垃圾回收器回收那些不是 GC Roots 的對(duì)象并且不再被GC Roots引用的對(duì)象。
這里有幾種可以作為 GC Roots 的對(duì)象。一個(gè)對(duì)象可以屬于多種類型的 Root。有以下幾種類型的 Root 對(duì)象。
Class-通過系統(tǒng)的類加載器加載的class。這種class是不可能被卸載的。它們可以通過靜態(tài)數(shù)據(jù)域引用對(duì)象。這里需要注意的是,通過用戶自定義的類加載器加載的Class并不能作為 GC Roots,除非相應(yīng)的 java.lang.Class 的實(shí)例恰巧成為 GC Roots 對(duì)象。
Thrad-存活的線程
Stack LocalJava 方法中的變量或者方法形參
JNI Local-JNI方法中的變量或者方法形參
JNI Global-全局 JNI引用
Monitor Used-用于同步監(jiān)控的對(duì)象
Held by JVM-JVM由于一些原因會(huì)從垃圾回收器中持有一些對(duì)象的引用。實(shí)際上,這里和 JVM本身的實(shí)現(xiàn)有關(guān)。一些可能的已知原因是,系統(tǒng)的類加載器,一些jvm自身已知的異常類,一些預(yù)分配的異常處理對(duì)象,正在加載類的自定義類加載器。很不爽的是,JVM基本沒有提供額外的細(xì)節(jié)去描述這些對(duì)象。因此,這僅僅能通過分析去判斷哪些對(duì)象是所謂的 JVM持有的。
如果一個(gè)對(duì)象是一個(gè) GC Roots 對(duì)象,在所有的視圖中它都會(huì)被特別的標(biāo)記來表明它是一個(gè)獨(dú)立的對(duì)象。下面這張圖展示了一個(gè) Fragment 中的對(duì)象視圖路徑
