linux查看堆外内存,记一次堆外内存泄漏排查过程

本文记录了一次排查Java进程堆外内存泄漏的过程,涉及NMT、pmap、smaps和gdb的使用,最终发现与netty-socketio框架的使用有关,通过代码优化解决问题。
摘要由CSDN通过智能技术生成

本文涉及如下内容前端

开启NMT查看JVM内存使用状况

经过pmap命令查看进程物理内存使用状况

smaps查看进程内存地址

gdb命令dump内存块

背景

最近收到运维反馈,说有项目的一个节点的RSS已是Xmx的两倍多了,由于是ECS机器因此项目能够一直运行,幸好机器内存充足,否则就可能影响到其余应用了。java

排查问题

经过跳板机登陆到目标机器,执行top命令,再按c,看到对应的进程所占用的RES有8个多G(这里当时忘记截图了),可是实际上咱们配置的Xmx只有3G,并且程序仍是正常运行的,因此不会是堆占用了这么多,因而就把问题方向指向了非堆的内存。linux

首先想到经过Arthas查看内存分布状况,执行dashboard命令,查看内存分布状况git

bVbOGHF

发现堆和非堆的内存加起来也就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: 默认关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值