1. 程式人生 > >Java中計算對象的大小

Java中計算對象的大小

bject tro 項目依賴 all 返回值 not 檢測 app main

一、計算對象大小的方法

Java中如何計算對象的大小呢,找到了4種方法:

1.java.lang.instrument.Instrumentation的getObjectSize方法;

2.BTraceUtils的sizeof方法;

3.http://yueyemaitian.iteye.com/blog/2033046中提供的代碼計算;

4.https://github.com/mingbozhang/memory-measurer提供的工具包;

本質上java.lang.instrument.Instrumentation的使用是其他三種方法的基礎,但是該類中的方法getObjectSize只是計算了對象本身,JDK註釋描述:

Returns an implementation-specific approximation of the amount of storage consumed by
the specified object. The result may include some or all of the object‘s overhead,
and thus is useful for comparison within an implementation but not between implementations.

第2種是使用BTrace的方法,可以對生產環境的程序進行檢測,但是BTraceUtils的sizeof實現上直接調用的還是java.lang.instrument.Instrumentation的getObjectSize方法,所以還是存在第1種方法的問題。第3中方法可以計算數組的大小,但是無法計算HashMap等對象。第4種方法支持對HashMap等常見對象的大小計算。

第1種方法網上可以找到很多資料可以參考,第3中方法鏈接博文內容已經很詳細。這裏給出第2中方法以及第4種方法的使用步驟。

二、BTrace中計算對象大小

我使用的版本是Java VisualVM中的插件版本。VisualVM打開方式為命令行輸入jvisualvm,

技術分享

安裝插件BTrace,安裝成功的話,查看Plugin窗口

技術分享

安裝插件這部分工作這裏就不說了,下面演示如何使用。

啟動tomcat,在VisualVM左側中選擇剛剛啟動的tomcat,右鍵彈框中選擇Trace application

技術分享

這時右側將會打開BTrace窗口:

技術分享

下方寫的代碼是BTrace用於檢測com.test.data.TestBtrace類在執行search方法後返回值的大小。

點擊start按鈕執行成功顯示如下,說明已經進入監視狀態:

技術分享

執行tomcat上面的com.test.data.TestBtrace中search方法,BTrace控制臺打印出了返回結果對象的類型以及對象大小,每次都是48 bytes。

技術分享

具體BTrace腳本說明以及例子可以參考:https://github.com/mingbozhang/btrace

其中docs有幫助文檔,samples有例子。

三、使用MemoryMeasurer計算對象大小

到https://github.com/mingbozhang/memory-measurer上面將源碼下載到本地,編譯需要本地預先安裝java,maven。

1.加入檢測代碼到目標代碼中

這裏的使用方法不像BTrace的低侵入,需要在代碼中加入檢測代碼:

long memory = MemoryMeasurer.measureBytes(objectToTest);

通過輸出日誌或者其他方式將上面代碼中變量memory內容獲取到。

2.啟動TOMCAT是在JAVA_OPTS中加入:

-javaagent:<實際目錄>/memory-measurer-0.1.0-SNAPSHOT.jar

3.啟動TOMCAT,操作application並查看打印出的待檢測對象的大小信息。

使用該方法測試出的com.test.data.TestBtrace中search方法返回結果對象大小為:349264 bytes

註意:由於此項目依賴guava包,如果待測試代碼直接main方法啟動使用target生成的memory-measurer-0.1.0-SNAPSHOT.jar,如果是檢測tomcat上的application則需要使用target生成的memory-measurer-0.1.0-SNAPSHOT-jar-with-dependencies.jar。

四、思考

找到的這幾種方法第1、2中是比較官方一些的方法。3、4是個人寫的代碼或者工具。如果尋找容器對象真實大小這個需求是個迫切需求,為什麽沒有看到官方版本的對象真實大小計算工具?是沒有意義嗎?

Java中計算對象的大小