从堆转储文件中识别堆内存大小?

7
我正在使用-Xmx512m,在内存不足错误后,我得到了一个堆转储。在将此堆转储加载到JAVA VisualVM中时,堆大小显示为超过1 GB。
我无法理解当我的-Xmx值为512 MB时,堆大小如何增长到1 GB以上。

VisualVM Screen shot

编辑

我查看了被标记为重复的问题的其他答案,我得到了其中一部分答案:JVM有非堆内存和其他内存部分(如下图所示)。

JVM Memory Parts

但仍有一个问题未解决。有没有办法从堆转储中仅识别堆内存的大小?


1
我们已经编辑了这个问题,它不再是一个重复的问题。 - Vipin
@TomasHurka 我无法提供转储文件,但你可以拿任何一个转储文件作为例子。 - Vipin
不,它在其他情况下运行良好。 - Tomas Hurka
迟来的答案比没有强,但无法从堆转储中计算出实际堆大小,因为某些相关信息丢失了,例如用于引用的实际指针大小或者是否使用字节或单个位存储布尔数组等。此外,堆转储仅包含纯对象数据,而运行时堆中的占用则受到地址对齐和填充的影响。因此,分析工具必须对相关的JVM属性和设置进行一些猜测,以估计堆大小。说到JVisualVM和2014年,它可能不知道CompressedOOPs... - Holger
@Holger,四年后我现在使用XX:NativeMemoryTracking,它可以在一定程度上提供内存信息(与热点相关的内存使用情况)。在JDK 8中,它仍然无法跟踪第三方本地代码内存分配,我也不记得在最新的JDK版本中看到任何相关的更新。 - Vipin
显示剩余6条评论
2个回答

0

Java堆不会超过指定的-Xmx。堆分配在JVM初始化时完成,因此无法在运行时进行堆扩展。如需更多确认,请添加-verbose:gc jvm参数以收集GC占用情况,检查日志的最后一个周期,以验证应用程序的可用空间和已分配空间。


请查看我在编辑部分结尾更新的问题。 - Vipin
这个工具可以帮助监控Java进程的运行时状态。希望这能满足您的需求。 - Mohan Raj

-3

我觉得这可能对你有帮助

https://www.eclipse.org/mat/

我不确定是否可以仅从堆转储中打开堆内存,但值得一试。

编辑

您可以使用JConsole enter image description here

它会显示您要查找的内容。


1
使用Jconsole我可以识别正在运行的Java进程的堆使用情况,但我想从堆转储中识别堆使用情况。 - Vipin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接