平时出现内存溢出以及死锁,通常处理方式都是查看日志,找到抛出异常的代码行,而后本地分析代码,可是这样对于线上排查十分糟糕,这段时间在研究JVM发现了几个比较好的工具和指令.eclipse
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来分析.orm
(5).首先须要安装Memory Analyzer,地址为http://archive.eclipse.org/mat/1.2/update-site/ 或者 下载插件版均可以对象
(6).将堆转储文件加载进Eclipse.进程
(7).过段时间再次生成一个堆转储文件.ip
(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).根据打印出的信息若是有异常状况很容易就找到出问题的代码行数