[英]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個布爾值,則在同一對象中找到它們是一回事,而如果它們分散在多個對象中則是另一回事(由於對齊導致過多的空間使用) 。 可以將這個邏輯實現為另一個訪問者 (類似於MemoryMeasurer和ObjectGraphMeasurer的實現方式-就像您可能看到的一樣簡單),但是我沒有打擾,因為那是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.