2014-03-31 33 views
1

我正在比較Trie與存儲英文單詞的HashMap,超過100萬。數據加載後,只執行查找。我正在編寫代碼來測試速度和內存。速度似乎很容易測量,只需在測試代碼之前和之後記錄系統時間即可。如何測量數據結構的內存使用情況?

測量對象內存使用情況的方法是什麼?在這種情況下,它可以是Trie和HashMap。我觀察了系統性能監視器並在Eclipse中進行了測試。操作系統性能監視器顯示我的測試程序啓動後使用了超過1G的內存。我懷疑存儲數據需要太多內存的事實。

此外,在我的Windows機器上,它顯示在整個測試時間內,內存使用量持續上升。這不應該發生,因爲數據的初始加載時間很短。之後,在查找短語中,不應該有更多額外的內存消耗,因爲不會創建新對象。在linux上,內存使用看起來更穩定,但它也增加了一些。

請您分享一些想法嗎?非常感謝。

+0

你想測量[你的內存中的數據結構的大小](http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the -size-的-一個對象)? – 2rs2ts

+0

[計算Java中Object的大小]的可能的重複(http://stackoverflow.com/questions/9368764/calculate-size-of-object-in-java) –

+1

根據你的trie的實現,它可能需要1G爲一百萬條目。但既然你沒有顯示任何代碼,任何人都不可能給你一個分析。或者,您可以採取堆轉儲並將屬於您的trie的碎片相加。獲取堆轉儲的說明是[here](http://www.kdgregory.com/index.php?page=java.outOfMemory#heapDumps)。 – kdgregory

回答

0

您是否嘗試過使用Java SDK中的Oracle提供的「jps」工具?你可以在JavaSDK/bin文件夾中找到它。它是性能檢查甚至內存使用的好工具。

+0

哎呀...有些誤會。它不是「jps」的「jvisualvm」。 – Sri777

1

簡短的回答是:你不能。 長的答案是:您可以通過在測試前後多次重複調用GC的差異內存分析來計算內存中對象的大小。但即使如此,只有非常大的數字或圓形才能接近實際大小。你首先需要一個預熱階段,即使所有的接縫工作都很順利,你可能會陷入jit和其他優化,你不知道。

總的來說,計算所用對象的數量是一個很好的經驗法則。

如果您的樹實現使用對象作爲表示數據的結構,與地圖相比,您的內存消耗很可能很高。

如果您有大量數據,地圖可能因衝突而變得緩慢。

常用的方法是在需要優化的情況下進行優化。

相關問題