平时出现内存溢出以及死锁,一般处理方式都是查看日志,找到抛出异常的代码行,然后本地分析代码,但是这样对于线上排查十分糟糕,这段时间在研究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).根据打印出的信息如果有异常情况很容易就找到出问题的代码行数
来源:oschina
链接:https://my.oschina.net/u/2462104/blog/1860713