现象
top显示常驻内存已经达到14G,而JVM本身的内存占用不高 -XMX 配置的是4096M.
分析
jmap -heap pid
jvm本身是没有问题的,而且应用表现也没有什么异常,但机器的内存已经占用很高,触发了机器监控的
内存报警.因为这个应用使用了netty,因为初步分析应该是有Direct Memory 没有回收处理。
采用pmap 查看进程内存情况
pmap -x pid
发现有大量的131072k 即128M。这样的内存地址有77个,应该这就是为什么内存一直高的原因了。
接着找到是谁怎么创建的这些堆外内存,首先怀疑的重点对象就是netty了。netty 这个高性能的nio框架
会申请堆外内存。但不能去全盘看netty的源码,这不太可能,所以只能先看看这些内存里面是存的是什
么东西,看看能否有什么线索。采用gdb这个工具来尝试一把
gdb --pid pid
然后执行
dump binary memory result.bin 0x00007f2908000000 0x00007f2910000000
会