【发布时间】:2017-12-19 21:48:39
【问题描述】:
我们遇到了虚拟服务器 (VM) 耗尽本机内存的问题。这些虚拟机正在运行: Linux 7.2(麦坡) 野蝇 9.0.1 Java 1.8.0._151 运行(不同的 JVM 有不同的堆大小。它们的范围从 0.5G 到 2G) JVM 参数是:
-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进程使用的内存量大于使用-XX:NativeMemoryTracking=detail显示的堆+元空间+压缩
是否有工具可以告诉我本机内存中的内容(如堆转储但不是堆)?
是否有任何工具可以将 java 堆使用情况映射到非 jemalloc 的本机内存使用情况(堆外)?我已经使用 jemalloc 来尝试实现这一点,但是正在绘制的图形只包含十六进制值而不是人类可读的类名,所以我无法真正从中得到任何东西。也许我做错了什么,或者我需要其他工具。
任何建议将不胜感激。
【问题讨论】:
-
可能是原生字节缓冲区?
-
这看起来与 JVM 问题更相关,我们可能会更改 java 版本。请参阅 Oracle 的以下链接以了解非堆组件的内存泄漏。 bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8164293oracle.com/technetwork/java/javase/…
-
有关 jvm 内存使用的详细信息,请参阅此出色答案:stackoverflow.com/questions/53451103/…。这也很有用:jkutner.github.io/2017/04/28/…
-
你怎么知道你的问题是本机内存使用?您是否在同一个 VM 中运行多个 JVM?是不是你只需要更多的物理内存?