测者的性能测试手册: 内存异常-JVM内存故障排查方

举报
SUNSKY 发表于 2019/10/12 15:05:18 2019/10/12
【摘要】 系统的故障诊断是一个一步一步排除可能疑点找到问题所在的过程。今天测者和你一起学习JVM内存的故障排查方法。

系统的故障诊断是一个一步一步排除可能疑点找到问题所在的过程。今天测者和你一起学习JVM内存的故障排查方法。

Native Memory Tracking是什么

Native Memory Tracking (NMT) 是Java Hotspot VM的一个功能。用来跟踪Java 内存的使用情况,NMT可以追踪到堆内内存、code区域、通过unsafe.allocateMemory和DirectByteBuffer申请的内存,NMT不能跟踪C代码的申请的堆外内存的情况,因此有些时候需要配合操作系统级的内存检测工具使用。

Native Memory Tracking(NMT)的使用

NMT的使用是通过配置JVM启动参数来设置的,具体如下:

1.0.png

参数说明如下:

参数说明
off默认是off,关闭NMT
summary只收集汇总信息
detail收集全部信息

特别提醒:开启NMT后,性能会有5%-10%的损耗,因此,在发现有内存问题后,才能使用该工具,没有发现问题的时候,尽量使其关闭。

jcmd查看NMT报告

JDK提供了jcmd工具查看NMT的监控结果,具体格式如下:

1.1.png

参数说明:

参数说明
summary只打印按照分类汇总信息
detail打印按类别汇总的内存使用情况、打印虚拟内存映射、打印由呼叫站点聚合的内存使用情况
baseline创建内存快照,以比较不同时间的内存差异
summary.diff打印自上次baseline到现在的内存差异,显示汇总信息
detail.diff打印自上次baseline到现在的内存差异, 显示详细信息
shutdown关闭NMT功能

其中,scale 指定内存单位,默认为KB

其他一些辅助参数

在NMT退出的时候打印NMT报告

1.2.png

关闭NMT自动关闭功能

当NMT发现系统资源不足的时候,自行关闭。很多时候你并不希望这样,因此需要现实的告诉NMT不能关闭:

1.3.png

内存问题举例子

###现象 JVM启动参数中设置:

1.6.png

分析

测试过程总,发现服务器内存不断增大,通过如下命令:

1.4.png

有上看到-Xmx=6G,但是RSS在运行过程中11G,怀疑存在堆外泄露。

加入 -XX:NativeMemoryTracking=summary启动参数后,重启。查看NMT报告如下(重点关注committed大小,这个是实际使用的内存大小):

1.5.png

通过报告发现实际占committed大于物理内存,因此可以怀疑存在内存泄露问题。

本文转载自异步社区。

原文链接:https://www.epubit.com/articleDetails?id=N45bff44b-0785-45f9-84c1-7e71c2c3dd0a


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。