我正在尝试为在Kubernetes下在Docker中运行的Java进程诊断内存问题。

Java版本是Java 8(1.8.0):

root@myHost:/# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)


我看到许多在线讨论和建议and questions on SO涉及到Native Memory Tracking的使用。

如果启用NMT,对性能或内存使用有什么负面影响?

始终在“详细”级别启用NMT的生产是否正确/允许/建议:

-XX:NativeMemoryTracking=detail

最佳答案

Oracle Native Memory Tracking for Java 8 documentation


  获取详细数据:要获取有关本机内存使用情况的更详细视图,请使用命令行选项启动JVM:-XX:NativeMemoryTracking = detail。这将准确跟踪哪些方法分配了最多的内存。启用NMT将导致JVM性能下降5-10%,并且NMT的内存使用量将2个字作为malloc标头添加到所有malloc内存中。 NMT还会跟踪NMT内存使用情况。


启用NMT后,VM.native_memory的jcmd输出实际上将记录由于启用NMT而导致的内存分配开销:

#jcmd 25 VM.native_memory
25:

Native Memory Tracking:

Total: reserved=2724013KB, committed=1526785KB
-                 Java Heap (reserved=1048576KB, committed=1048576KB)
                        (mmap: reserved=1048576KB, committed=1048576KB)
...

    Native Memory Tracking (reserved=6004KB, committed=6004KB)
                        (malloc=384KB #6040)
                        (tracking overhead=5621KB)

关于java - 启用Java native 内存跟踪(NMT)对性能有何影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54301468/

10-10 09:24