Memory Analyzer Tool
這是一款功能強(qiáng)大的java堆內(nèi)存分析器,可以用于查找內(nèi)存泄漏以及查看內(nèi)存的消耗情況
mat打開hprof的時(shí)候
第一個(gè)就是進(jìn)行內(nèi)存泄漏的分析吐限,第二個(gè)是組件分析(啥意思)界斜,第三個(gè)是重新打開(如果之前生成過的話)
這里展示的應(yīng)該不是dump文件的大小,而是dump文件中迎变,內(nèi)存映射的總大小加缘。
從上到下是 對(duì)象的數(shù)量的直方圖沿侈,分配樹(對(duì)象的關(guān)聯(lián)關(guān)系),列舉對(duì)象的大小順序质礼,分析重復(fù)類加載
mat的直方圖分析GC ROOTS ,并且可以分析對(duì)象除掉一些虛旺聚,若,軟引用之外的GC ROOTS眶蕉。
在線程相關(guān)的信息里面分析出引用和入引用判斷對(duì)象的狀態(tài)
出引用砰粹,被該對(duì)象引用的對(duì)象
入引用,引用類該對(duì)象的對(duì)象
垃圾回收中造挽,關(guān)于淺堆和深堆的概念
淺堆
淺堆表示的是這個(gè)對(duì)象自身消耗的內(nèi)存碱璃,在不同位數(shù)的操作系統(tǒng)中,占用的字節(jié)數(shù)會(huì)有差異
舉個(gè)例子:
一個(gè)String對(duì)象饭入,對(duì)象中有int類型的hash32和int類型的hash嵌器,這兩個(gè)int類型占據(jù)八個(gè)字節(jié),然后一個(gè)char[]數(shù)組 value谐丢,引用類型在32位操作系統(tǒng)占據(jù)4個(gè)字節(jié)爽航。對(duì)象頭在32位系統(tǒng)占據(jù)8字節(jié)。所以這個(gè)對(duì)象一共是20字節(jié),不過對(duì)象的大小需要像8字節(jié)靠攏岳掐,所以是24字節(jié)凭疮。所以String對(duì)象的淺堆大小都是24字節(jié),無論你的String對(duì)象有多長(zhǎng)串述,淺堆都是24字節(jié)执解。
深堆
在講深堆之前,還得講個(gè)概念叫做保留集(只能被該對(duì)象直接或者間接訪問到的纲酗,除此之外衰腌,不能被訪問到的)
深堆的大小就是所有保留集的對(duì)象的淺堆之和。即對(duì)象被回收之后觅赊,能釋放真實(shí)空間
舉個(gè)例子
假設(shè)兩個(gè)String 右蕊,他們的value指向的是字符串常量池的同一個(gè)字符串,那么在計(jì)算這個(gè)String的深堆的時(shí)候就不能計(jì)算這個(gè)value的字節(jié)數(shù)
比如ObjectA和ObjectB吮螺,ObjectA持有ObjectB的引用饶囚,并且沒有別的對(duì)象能訪問到ObjectB。
那么ObjectA的深堆大小就是ObjectA和ObjectB的淺堆之和鸠补。
另外我們熟悉的一個(gè)概念萝风,對(duì)象實(shí)際大小
支配樹的概念
在對(duì)象引用圖中,假設(shè)所有指向B的路徑都要經(jīng)過A紫岩,那么就認(rèn)為A支配了B规惰,如果A是B最近的一個(gè)支配折,那么就認(rèn)為A是B的直接支配者
支配樹有以下特征: