2010-10-21 176 views
11

我正在計算java對象[hashmap]的大小[內存使用]。它包含不同數據類型的元素[在運行時],所以[元素大小]不是一種好的方法。該代碼現在按系列執行它計算Java對象的字節大小

if (x) 
    do something 
else if (primitives) 
    lookup size and calculate 

但是,此過程是一個CPU繁忙且無效。

我想到的是以下2種方法代替:

  1. 序列化對象的緩衝區,並獲得大小。
  2. 查找到的java.lang.instrument得到

我找任何人使用這些方法的性能,效率,縮放等,或如果你知道什麼更好的方法經驗的大小。

P.S: 這是一個背景實用程序,我正在建設,所以大小不需要超級準確,但它應該是正確的。所以我願意犧牲精度性能

我不感興趣的深尺寸[受此對象refered將不被計算對象的大小。]

我正在尋找一個性能比較和理解getObjectSize()內部是如何工作..所以我不messup別的東西來提高性能

感謝

+0

什麼*確切*你的意思是大小?內存佔用量?包含的元素數量? – 2010-10-21 00:32:37

+0

的大小,我的意思是採取的內存量..編輯反映, – codeObserver 2010-10-21 00:42:20

+1

或多或少相同的問題:http://stackoverflow.com/questions/757300/programatically-calculate-memory-occupied-by-a-java- object-including-objects-it-r – andersoj 2010-10-21 01:08:04

回答

4

使用getObjectSize()的儀器包的方法。

here實現細節:

+0

thnx ..我正在尋找性能比較和理解getObjectSize()如何在內部工作..所以我不弄亂其他東西來提高性能//儘管我認爲getObjectSize是我的最好的選擇。 – codeObserver 2010-10-21 01:24:24

2

序列化的大小是絕對不能去的,原因有兩個方式:

  • 標準Java序列化可以有相當多的開銷,這會的添加到大小。
  • 它不會比使用getObjectSize()方法更快,我們可以假設它會迭代所有引用,並使用某種查找來確定對象的原始值/引用的大小。

如果你需要更好的表現,那真的會取決於你的對象的分佈。一種可能性是對地圖中的值進行一些隨機抽樣,確定平均值並根據此值計算估計值。

有關如何在散列映射中查找隨機值的建議,請參閱此question

+0

Thnx..Random採樣可能非常不準確,因爲哈希映射中的值可能在很大程度上有所不同。 – codeObserver 2010-10-21 01:28:07

2

您可能會對我前一段寫在how to calculate the memory usage of a Java object上的文章感興趣。無可否認,它主要針對32位Hotspot,儘管其中大部分實質上適用於其他環境。

您也可以從同一個網站下載簡單的agent for measuring Java object size,這將爲您帶來一些辛苦的工作,並應該在64位環境中工作。

作爲其他人的注意事項我想提到,對象的序列化形式不同於其在內存中的形式,所以如果要精確測量內存佔用情況,使用序列化並不合適。