2011-07-04 58 views
1

簡單的愚蠢問題。我有一個包含java對象的集合。這些對象不是同一個類的實例,但它們實現相同的接口並且在概念上非常「相似」,因此它們的大小應該非常相似。我需要了解這個集合在內存中佔用多少空間。什麼是最簡單(最好)的方法來計算呢?我知道我可以把每個可以駐留在集合中的java類,計算它們的大小(深度大小,反射等),得到平均值,乘以N(集合大小)並獲得最終值。測量內存中java對象佔用空間的最佳方式

但是這樣做是否可以通過其他方式完成 - 計算現有集合的大小(沒有在反射中潛水,字段大小等)?我明白,將集合序列化爲字節流並確定輸出大小將不起作用,因爲序列化不會反映確切的對象內存佈局。但也許有其他方法可以做到這一點?

+1

請注意,對於給定對象,不同的JVM可能不會使用相同的大小。 –

+0

具有不同大小引用的相同JVM不太可能使用相同數量的內存。 –

回答

1

如果使用像YourKit這樣的分析器,它可以告訴你一個對象的深度大小。你可以使用Instrumentation.getObjectSize(),但它真的很痛苦(並且它只給你一個淺的大小)

最好的方法可能是自己估計/計算它。將每個字段的大小相加(四捨五入到接下來的8個字節),如果使用的是64位JVM並且Compresses Oops已關閉,則每個對象需要添加12個字節的開銷或16個字節。

+0

@Peter的開銷是否至少取決於VM的位數?我認爲Hotspot虛擬機每個對象有3個字節的開銷 – Voo

+0

@Voo,我認爲你是對的。開銷接近12字節。最新的JVM在Windows上默認使用壓縮的oops,因此它在32位和64位JVM上都有12個字節。 –

+0

@didxga,你如何使用JMeter獲取對象的大小? –

相關問題