![](/img/trans.png)
[英]How to estimate the time and memory consumption of a program that uses recursion Java
[英]How do I estimate a class's total permgen memory consumption?
最近,我寫了一個類,在其中我發現我可以減少~10個字節/元素的內存消耗,但這只是以使代碼更加復雜為代價。 這使編譯的.class
文件的大小增加了大約10KB。
我假設JVM必須將.class
文件加載到內存中,因此除非至少有1000個元素,否則這些更改不會為自己付費。 但是,除非類文件中額外的10KB是增加代碼復雜性的唯一成本,否則該算法無法解決。
這個Oracle博客表明,permgen中的類消耗了大量的額外內存,而不僅僅是基於.class
文件 - 例如,我懷疑更復雜的代碼可能需要更多的內存來優化元數據。
所以,這個問題有兩個部分:
Dalvik VM的類似細節將不勝感激,但我主要關注的是OpenJDK和其他“主流”JVM。
如何測量特定類的實際permgen內存消耗? 在運行時使用某些工具還是使用性能分析工具?
一種方法可以是加載類以在不同的類加載器中進行測量,並使用此博客條目中提供的jmap -permstat
。
對於每個類裝入器對象,將打印以下詳細信息:
- 類加載器對象的地址 - 在運行實用程序時的快照中。
- 加載的類數(由此加載器使用方法(java.lang.ClassLoader.defineClass)定義)。
- 此類加載器加載的所有類的元數據消耗的大致字節數。
- 父類加載器的地址(如果有)。
- “實時”或“死”指示 - 指示加載器對象將來是否將被垃圾收集。
- 此類加載器的類名。
這是你第二點的答案; 我不確定這會有多大用處,但我發現演示文稿中的幻燈片構建內存高效的Java應用程序:實踐和挑戰對於估計各種Java對象的大小和健康狀況非常有幫助。 在估計32位和64位JVM中對象的大小時,他會詳細介紹,並提供指針以使對象更具內存效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.