2012-06-18 51 views
5

我有一個類,我想看看當這個類的對象被序列化時哪個子對象佔據了最多的空間。除了查看代碼並手動分析代碼之外,是否有任何好的工具/方法來執行此操作?Java - 簡單的方法來檢查序列化對象的結構?

例如,我希望工具說「會員a佔20%,b 30%,會員c佔50%」。

謝謝

P.S.我發現了一些相關的問題,但沒有找到答案在那裏我的具體問題。

+0

可能與提到serialysis工具:(http://marxsoftware.blogspot.com/2011/12/estimating-java-object-sizes-with [與儀表估計Java對象尺寸] .html) – npe

+0

請參閱我對#alexey28的評論 - 我對序列化對象的結構感興趣,而不是內存中對象的結構 – duduamar

+1

java中沒有'子對象'。這不是一個語義問題。如果一個對象的兩個成員本身擁有共同成員,那麼你如何計算這個份額? – aalku

回答

-1

嗯,我從來沒有聽說過這樣的工具。但我認爲內存中的對象大小和序列化對象大小之間存在一些關係。因此,您可以嘗試使用Profiler:VisualVM,它包含在JDK或我最喜歡的YourKit Profiler中。

+1

有一些關係,但沒有那麼強烈的關係 - 班級可以選擇序列化一些成員,並放棄其他成員。這可以完全改變圖片... – duduamar

+0

讓其他答案的方式。如果沒有人知道這樣的工具,並且你需要精確測量 - 你必須自己寫。 – alexey28

1

計算對象大小的唯一相對較快的方法是首先編寫整個對象,計算使用情況(例如,寫入ByteArrayOutputStream),然後寫入每個引用的對象。

有一對夫婦的這種考慮:

  • 用ObjectOutputStream確實做了一些緩存,從而可以參考以前編寫的對象用一個簡單的指針。使用reset()方法清除此緩存。
  • 每個寫入的新對象類型,首先都有類描述。這種開銷取決於您所指的同類型對象的數量。
  • 有一個(小的,4字節)開銷來初始化ObjectOutputStream。

對於協議的描述,請閱讀this description

+0

這就是我認爲要這樣做的方式,除非我會得到更好的答案,這將是方式。謝謝。 – duduamar

相關問題