平時出現內存溢出以及死鎖,通常處理方式都是查看日誌,找到拋出異常的代碼行,而後本地分析代碼,可是這樣對於線上排查十分糟糕,這段時間在研究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).根據打印出的信息若是有異常狀況很容易就找到出問題的代碼行數