2011-04-02 71 views
8

我想測試一個對象引用在我正在使用的Java VM中使用多少個字節。你們知道如何測試這個嗎?如何測試對象引用在Java中使用多少個字節?

謝謝!

+1

我只是猜測在這裏,但爲什麼不寫一個0字節的alloc'd程序,只是循環建立一個基線,然後分配100,000(100萬像需要)相同類型的objs 。大小的差異(可能)是一個合理的估計。歡迎Java大師來提出這個想法;-) – shellter 2011-04-02 02:43:16

+0

@Shelter:對於現代的操作系統,JVM和GC來說,結果可能太細微而不實用。 – 2011-04-02 02:52:35

+0

迄今爲止得到的答案似乎與對象大小有關。但是,您的問題明確指出了對象_reference_的大小。如果你確實在尋找參考大小,那麼請參閱http://stackoverflow.com/questions/981073/how-big-is-an-object-reference-in-java-and-precisely-what-information-does-it-it- CON – WhiteFang34 2011-04-02 05:56:50

回答

10

以問題字面上看,在大多數的JVM,在32位的JVM的所有引用採取4個字節,一個64位的JVM,參考需要8個字節除非-XX:+ UseCompressedOops已被使用,在這種情況下它需要4個字節。

我假設你問的是如何判斷一個對象佔用了多少空間。你可以使用Instrumentation(不是一件簡單的事情),但這隻會給你一個淺的深度。 Java傾向於闖入許多對象,而C++可能是一個單一的結構,所以它沒有那麼有用。

但是,如果你有內存問題,我建議你一個內存分析器。這將爲您提供淺層和深層空間物體的使用,併爲您提供整個系統的圖像。這通常更有用,因爲即使您已經開發Java十年以上,您也可以從最大的用戶開始並優化這些用戶,但只會猜測最佳優化位置在哪裏,除非您有硬數據。

如果不想使用分析器,獲取對象大小的另一種方法是分配一個大數組,並查看佔用了多少內存,您必須多次執行此操作才能獲得一個好主意,大小是。我會將年輕人的空間設置的很高,以避免GC導致您的結果混淆,例如-XX:NewSize=1g

2

可以從JVM的不同而不同,但JVM說"Sizeof for Java"

你可能會記得「Java技巧130:你知道你的數據大小」描述了基於創建大量相同類實例並仔細測量JVM使用堆大小的結果增加的技術。在適用的情況下,這個想法非常有效,我將會用它來引導本文中的替代方法。

1

This one是我使用的一個。必須愛這些16字節的引用! alphaworks.ibm.heapanalyzer

相關問題