我正在尝试为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
答案 0 :(得分:1)
来自Oracle Native Memory Tracking for Java 8 documentation:
获取详细数据:要更详细地了解本机内存使用情况,请使用命令行选项启动JVM:-XX:NativeMemoryTracking = detail。这将准确跟踪哪些方法分配了最多的内存。启用NMT将导致JVM性能下降5-10%,并且NMT的内存使用量将2个字作为malloc标头添加到所有malloc内存中。 NMT还会跟踪NMT内存使用情况。
启用NMT后,VM的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)