如何用jstat快速监控JAVA程序内存溢出?

陈多斌


Java虚拟机统计监控工具jstat(Java Virtual Machine statistics monitoring tool)。

首先,我们得明确一下jstat的作用:对JVM进行统计监控,并且是实时的。那么监控java虚拟机的哪些数据呢?

我们先看看jstat是如何使用的,linux下执行:

jstat -help

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]/<count>/<interval>/<vmid>/<lines>/<option>

再看看有哪些options:

jstat -options

举例说明之(其他参数大家可以自己实际练习看看都输出哪些数据):

jstat -gc -t -h10 27691 2000 10

看这一大堆数字,烦不烦?恶不恶心?有看下去的心情吗?通过这些数据来快速分析内存泄漏问题能快速起来吗?

上面是对jstat的一个的基本介绍,大家应该可以看出来,想通过jstat去监控内存健康状态是没问题的,但是也得清楚的了解JVM的相关知识,要搞清楚年轻代、永久代、YGC、FGC,并根据这些数据来判断是否有内存泄漏的问题或者风险。

然而,它并不快,线上出问题了经不起你这么折腾的,所以这里个人认为jstat可以当做一个监控&预警工具,而不是问题排查工具去使用。(大家有不同的意见可以评论区交流讨论~)

这里,我建议的方法是:

  1. 如果你觉得你的应用有内存泄漏的问题,那么千万别重启或者停止应用,要保留第一现场(这是第一步,第一步没有了就等下一次内存泄漏吧~可以考虑通过slb把这台机器摘掉,避免影响用户)

  2. 用java自带的工具jmap dump现场文件: jmap -dump:format=b,file=heap.bin

  3. 用MAT工具分析heap dump文件,现场文件拿到手了,剩下的就是学会使用MAT分析文件了,其实也不用你分析,需要做的事情MAT都帮你做好了,通过MAT即可分析出吃内存的对象是什么了,这样就可以定位到内存泄漏的问题了。

以上,是我对java内存泄漏问题定位的个人认识,欢迎大家积极讨论学习,共同成长~


分享到:


相關文章: