堆堆分析与堆分析后的堆大小不同

jae*_*ong 15 java eclipse jvm memory-leaks heap-dump

我正在经历内存泄漏,这里有一些细节.

__PRE__

我很惊讶顶部,堆转储大小和实际堆大小之间的差异.我猜测顶部和堆之间的区别是垃圾收集器堆和本机堆区域的可能性.但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT分析器)可能会有所不同?

对这个问题的任何见解?

更新/答案

一些建议是使用jcmd(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html),因为该网站告诉"本机内存跟踪".但是,如果你仔细阅读页面,你会看到

__PRE__

因此,如果本机库中存在泄漏,则jcmd不是一个选项.

在爬行互联网几天并尝试各种剖析器之后,对这个问题最有效的方法是使用jemalloc剖面仪.

这个页面对我帮助很大! https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/

Arn*_*was 5

我也经历过类似的情况。差异(HPROF 文件大小 - MAT 指示的堆大小)实际上是垃圾(无法访问的对象)。MAT 中无法到达的对象直方图应该对此有所帮助。

jmap -F -dump:live,format=b,file=<file_name.hprof> <process_id>只会转储活动对象而不是垃圾。


Nik*_*kem 4

top和其他操作系统级工具显示 JVM 进程消耗了多少系统内存。由命令行选项定义的 Java 堆-Xmx只是该内存的一部分。除了堆之外,JVM 本身还需要一些内存。然后是java线程,每个线程都需要一定的内存。和元空间/永久代。还有其他几个。您可以阅读这篇博文这个 SO 答案以获取更多信息。

关于转储文件的大小和实际堆大小,@arnab-biswas 的答案肯定是正确的。MAT 报告由活动对象消耗的实际使用堆的大小。但堆转储包含整个堆,包括垃圾。