问题
我们正在尝试找到我们Web应用程序中一个大的内存泄漏的罪魁祸首。我们对于查找内存泄漏的经验非常有限,但是我们找到了如何使用jmap
制作Java堆转储文件并在Eclipse MAT中进行分析。
然而,当我们的应用程序使用56/60GB内存时,堆转储文件只有16GB大小,甚至在Eclipse MAT中更少。
背景
我们的服务器在Ubuntu 14.04上使用Wildfly 8.2.0作为我们Java应用程序的运行环境,其进程使用可用内存的95%。在制作堆转储文件时,我们的缓冲区/高速缓存使用空间为56GB。
我们使用以下命令来创建转储文件:sudo -u {应用程序用户} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid}
堆转储文件大小为16.4GB,在使用Eclipse MAT进行分析时,它说有大约1GB的活动对象和~14.8GB的不可访问/浅堆。
编辑:这里有关于我们看到发生的问题的一些更多信息。我们监控我们的内存使用情况,并且我们看到它不断增长,直到只剩下约300MB的可用内存。然后它会保持在这个内存量左右,直到进程崩溃,不幸的是应用程序日志中没有错误信息。
这使我们假设这是一个硬OOME错误,因为这仅在内存接近耗尽时才会发生。我们使用-Xms25000m -Xmx40000m
的JVM设置。
问题
基本上,我们想知道为什么我们的大部分内存没有在这个转储文件中捕获。最高维持大小类看起来并不太可疑,所以我们想知道是否有一些与堆转储相关的问题,我们做错了什么。
X
数量的内存,并不意味着Java堆是X
。 - Kayamanfree -h
来查看我们的内存使用情况。 - Thermometer