JVM学习手册(X):查看堆内存使用情况以及排错

亡梦爱人 提交于 2019-11-29 23:57:07

平时出现内存溢出以及死锁,一般处理方式都是查看日志,找到抛出异常的代码行,然后本地分析代码,但是这样对于线上排查十分糟糕,这段时间在研究JVM发现了几个比较好的工具和指令.

1.针对频繁GC和内存溢出:

(1).首先找到有哪些线程在执行,使用指令jps.

(2).查看堆内存使用情况,使用指令jstat -gc 进程ID 刷新毫秒 刷新次数(PS: jstat -gc 1111 250 5,即对于线程1111在堆中使用情况,250毫秒刷新一次,总共刷新5次)

(3).可以将堆内存使用情况生成堆转储文件,使用指令jmap -dump:format=b,file=文件名 进程ID

(4).使用jhat或者Memory Analyzer分析堆转储文件,这里使用Memory Analyzer来分析.

(5).首先需要安装Memory Analyzer,地址为http://archive.eclipse.org/mat/1.2/update-site/ 或者 下载插件版都可以

(6).将堆转储文件加载进Eclipse.

(7).过段时间再次生成一个堆转储文件.

(8).将两个文件都用Memory Analyzer加载进去,

(9).选择柱状图标志(Create a histogram...),选择最后一个标志(compare to another Heap Dump),最后选择多个文件夹标志(Group result by)中的Group by package,对比两次生成文件产生对象是否有差异,然后定位具体代码.

2.针对死锁

(1).首先找到有哪些线程在执行,使用指令jps.

(2).查看进程运行状态,使用指令jstack -l 进程ID(-l 显示线程阻塞/死锁的情况)

(3).根据打印出的信息如果有异常情况很容易就找到出问题的代码行数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!