我们遇到的问题是虚拟服务器(VM)耗尽了本机内存。这些VM正在运行: Linux 7.2(Maipo) Wildfly 9.0.1 运行Java 1.8.0._151(不同的JVM具有不同的堆大小。它们的范围从0.5G到2G) JVM args是:
-XX:+UseG1GC
-XX:SurvivorRatio=1
-XX:NewRatio=2
-XX:MaxTenuringThreshold=15
-XX:-UseAdaptiveSizePolicy
-XX:G1HeapRegionSize=16m
-XX:MaxMetaspaceSize=256m
-XX:CompressedClassSpaceSize=64m
-javaagent:/<path to new relic.jar>
大约一个月后,有时更长时间,VM开始使用他们所有的交换空间,然后最终OOM-Killer注意到java使用了太多内存并杀死了我们的JVM之一。
java进程使用的内存量大于堆+ metaSpace +压缩,如使用-XX所示:NativeMemoryTracking = detail
是否有工具可以告诉我这个本机内存中的内容(如堆转储但不是堆)?
是否有任何工具可以将java堆使用情况映射到非jemalloc的本机内存使用情况(堆外)?我已经使用jemalloc来尝试实现这一点但是正在绘制的图形只包含十六进制值而不是人类可读的类名,因此我无法从中获得任何结果。也许我做错了,或者我需要另一种工具。
任何建议都将不胜感激。
答案 0 :(得分:0)
您可以使用jcmd。
使用-XX启动应用程序:NativeMemoryTracking =摘要或 - XX:NativeMemoryTracking =细节
使用jcmd监控NMT(本机内存跟踪器)
jcmd&#34; pid&#34; VM.native_memory baseline //获取基线
jcmd&#34; pid&#34; VM.native_memory detail.diff //基于您需要从基线分析本地内存变化的更多信息