簡體   English   中英

我如何估計一個班級的總permgen記憶消耗量?

[英]How do I estimate a class's total permgen memory consumption?

最近,我寫了一個類,在其中我發現我可以減少~10個字節/元素的內存消耗,但這只是以使代碼更加復雜為代價。 這使編譯的.class文件的大小增加了大約10KB。

我假設JVM必須將.class文件加載到內存中,因此除非至少有1000個元素,否則這些更改不會為自己付費。 但是,除非類文件中額外的10KB是增加代碼復雜性的唯一成本,否則該算法無法解決。

這個Oracle博客表明,permgen中的類消耗了大量的額外內存,而不僅僅是基於.class文件 - 例如,我懷疑更復雜的代碼可能需要更多的內存來優化元數據。

所以,這個問題有兩個部分:

  • 如何測量特定類的實際permgen內存消耗? 在運行時使用某些工具還是使用性能分析工具?
  • 有沒有辦法在我寫作時估計課堂的permgen內存消耗? (有了一些背景知識 ,您可以在編寫類實例時估計類實例的內存消耗;我想知道我們是否可以估計類本身的permgen內存消耗。)

Dalvik VM的類似細節將不勝感激,但我主要關注的是OpenJDK和其他“主流”JVM。

如何測量特定類的實際permgen內存消耗? 在運行時使用某些工具還是使用性能分析工具?

一種方法可以是加載類以在不同的類加載器中進行測量,並使用此博客條目中提供的jmap -permstat

對於每個類裝入器對象,將打印以下詳細信息:

  1. 類加載器對象的地址 - 在運行實用程序時的快照中。
  2. 加載的類數(由此加載器使用方法(java.lang.ClassLoader.defineClass)定義)。
  3. 此類加載器加載的所有類的元數據消耗的大致字節數。
  4. 父類加載器的地址(如果有)。
  5. “實時”或“死”指示 - 指示加載器對象將來是否將被垃圾收集。
  6. 此類加載器的類名。

這是你第二點的答案; 我不確定這會有多大用處,但我發現演示文稿中的幻燈片構建內存高效的Java應用程序:實踐和挑戰對於估計各種Java對象的大小和健康狀況非常有幫助。 在估計32位和64位JVM中對象的大小時,他會詳細介紹,並提供指針以使對象更具內存效率。

暫無
暫無

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

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