btrace sizeOf 與 jmap -histo中物件大小說明
阿新 • • 發佈:2019-02-19
眾所周知,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 --