本文涉及如下内容前端
开启NMT查看JVM内存使用状况
经过pmap命令查看进程物理内存使用状况
smaps查看进程内存地址
gdb命令dump内存块
背景
最近收到运维反馈,说有项目的一个节点的RSS已是Xmx的两倍多了,由于是ECS机器因此项目能够一直运行,幸好机器内存充足,否则就可能影响到其余应用了。java
排查问题
经过跳板机登陆到目标机器,执行top命令,再按c,看到对应的进程所占用的RES有8个多G(这里当时忘记截图了),可是实际上咱们配置的Xmx只有3G,并且程序仍是正常运行的,因此不会是堆占用了这么多,因而就把问题方向指向了非堆的内存。linux
首先想到经过Arthas查看内存分布状况,执行dashboard命令,查看内存分布状况git
发现堆和非堆的内存加起来也就2个G不到,可是这里看到的非堆只包含了code_cache和metaspace的部分,那有没有多是其余非堆的部分有问题呢?github
NMT
NMT是Native Memory Tracking的缩写,是Java7U40引入的HotSpot新特性,开启后能够经过jcmd命令来对JVM内存使用状况进行跟踪。注意,根据Java官方文档,开启NMT会有5%-10%的性能损耗。
-XX:NativeMemoryTracking=[off | summary | detail]
# off: 默认关闭