簡體   English   中英

為什么 Java 內存轉儲分析器中的堆總量與內存設置和 JVM 總使用量不對應?

[英]Why Heap total in the Java memory dump analyzer does not correspond to memory settings and the total JVM usage?

我們使用 Eclipse 內存分析器進行 Java(Tomcat Web 應用程序)轉儲。 結果餅圖中的總堆顯示為 86 Mb。 同時,該 JVM 的堆限制設置為 1.5GB,我們看到 JVM 的總使用量上升到 2.8GB。

為什么偏差這么大?

您的堆內存只是 JVM 使用的內存的一部分。 此外,您還有本機內存和 permgen。

您可以通過命令行參數限制 permgen 內存。 請參閱PermGen 實際上代表什么? . 根據我的經驗,permgen 限制默認為 1G,這比我們需要的要多得多。 我認為我們將其覆蓋到 128m。

本機內存要復雜得多。 這是由您的代碼直接或傳遞使用的本機庫分配的內存。

在 jrockit 中,您可以通過 jrcmd print_memusage 打印出內存摘要。 不知道如何在其他 JVM 中做到這一點。

另外: http ://www.ibm.com/developerworks/linux/library/j-nativememory-linux/index.html

請調用jmap -heap TOMCAT_PID ,您將看到當前堆使用情況(eden、survivor 空間、old 和 perm)

另請注意,Java 的實際內存使用量將是XMX + MaxPerm + XSS * 線程數。 我建議您閱讀有關 Java 內存消耗的精彩文章:http: //plumbr.eu/blog/why-does-my-java-process-consume-more-memory-than-xmx

請參閱此參考 - MAT 不顯示完整堆

症狀:在交互式監控內存使用情況時,使用的堆大小比 MAT 報告的要大得多。

在索引創建期間,內存分析器會刪除無法訪問的對象,因為各種垃圾收集器算法往往會留下一些垃圾(如果對象太小,移動和重新分配地址會很昂貴)。 但是,這應該不超過 3% 到 4%。 如果您想知道刪除了哪些對象,請按照此處的說明啟用調試輸出: MemoryAnalyzer/FAQ#Enable_Debug_Output

此外,此 Q/A 中應該有更多信息: eclipse memory Analyzer sees small part of whole heap dump (8GB)

嘗試Preferences -> Memory Analyzer -> Keep Unreachable Objects中的Keep Unreachable Objects選項。

暫無
暫無

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

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