繁体   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