簡體   English   中英

Java對象內存使用情況-IBM ivm 1.4.2

[英]Java Object memory usage - ibm jvm 1.4.2

是否可以在應用程序內的Java中找到對象的內存使用情況?

我想讓對象內存使用率成為應用程序運行時調試輸出的一部分。 我不想使用外部應用程序連接到VM。

我有一個問題,很少有類會占用大量內存並導致內存問題,我的應用程序崩潰。 我需要找到內存使用情況(我正在使用有限的內存資源)。

編輯:我正在使用Java 1.4:/

參見我的寵物項目MemoryMeasurer 一個小例子:

long memory = MemoryMeasurer.measureBytes(new HashMap());

您還可以得出更多定性的內存故障信息:

Footprint footprint = ObjectGraphMeasurer.measure(new HashMap());

例如,我使用后者來推導各種數據結構每次輸入成本 ,其中開銷是根據創建的對象,引用和基元的數量而不是字節(也可以)來衡量的。 因此,下次使用(默認) HashSet ,您會被告知,其中的每個元素花費1個新對象(不是您的元素),5個引用和一個int,這與HashMap的條目的花費完全相同(並不奇怪,因為任何HashSet元素都以HashMap結尾),依此類推。

您可以在任何對象圖上使用它。 如果對象圖包含您希望忽略的其他結構的鏈接,則應使用謂詞來避免探索它們。

編輯 Instrumentation對Java 1.4不可用(哇,人們還在用嗎?!),因此上面的memoryBytes調用對您不起作用。 但是第二個會。 然后,您可以編寫如下內容(如果您使用的是32位計算機):

long memory = footprint.getObjects() * 8 + footprint.getReferences() * 4 +
              footprint.getPrimitives().count(int.class) * 4 + 
              footprint.getPrimitives().count(long.class) * 8 + ...;

那給你一個近似值。 更好的答案是將其設置為最接近的16的倍數:

long alignedMemory = (x + 15) & (~0xF); //the last part zeros the lowest 4 bits

但是答案可能仍然是錯誤的,因為如果您發現例如16個布爾值,則在同一對象中找到它們是一回事,而如果它們分散在多個對象中則是另一回事(由於對齊導致過多的空間使用) 。 可以將這個邏輯實現為另一個訪問者 (類似於MemoryMeasurerObjectGraphMeasurer的實現方式-就像您可能看到的一樣簡單),但是我沒有打擾,因為那是Instrumentation工作,所以它只對低於1.5的Java版本有意義。

Eclipse MAT是一個非常好的分析內存的工具。

jdk附帶了一些工具,例如jmap和jhat,它們提供了對象級別的詳細信息。

以下鏈接提供了一段Java代碼,用於計算對象的大小:

http://www.javaworld.com/javaworld/javatips/jw-javatip130.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM