1. 程式人生 > >btrace sizeOf 與 jmap -histo中物件大小說明

btrace sizeOf 與 jmap -histo中物件大小說明

        眾所周知,btrace中可以使用 com.sun.btrace.BTraceUtils.sizeof(Object)來計算傳入的物件的大小;jmap -histo中也可以顯示heap中物件大小資訊,到底這兩個顯示的object size是“淺大小” 還是 “深大小”?

        簡單測試一下:

BTraceUtils.sizeof(Object):

        首先來看btrace,被測試程式碼如下:

 

btrace指令碼如下:

原理很簡單,通過攔截TestBtrace#work(Object) 計算傳入的TestBtrace物件的大小。

測試指令碼如下: 

 

執行指令碼,執行結果如下: 

 

OK,object大小才24 byte,而TestBtrace#data就是好幾MB,所以證明com.sun.btrace.BTraceUtils.sizeof(Object)算出的是物件的淺大小。

如果有興趣,可以修改TestBtrace 中的data的大小,再多試幾次。

jmap -histo:

還是上面的TestBtrace.java ,稍微修改一下執行指令碼,如下:

 

執行結果如下: 

 

由於TestBtrace 物件是不停在建立的,所以#instances 可能會有不同,但是可以肯定的是,jmap -histo 列印的也是物件的淺大小,和btrace一樣。

結論:

無論是BTraceUtils.sizeof(Object) 還是 jmap -histo,顯示的都是物件的淺大小,因此,在使用jmap -histo 排查記憶體洩漏的問題時,除了[B等基礎型別外([B等基礎型別已經是其真實大小),不能單純的通過#bytes 列判斷記憶體佔用,還是要綜合考慮才行。

好,祝大家玩兒的愉快!

-- EOF --