JVM學習手冊(X):查看堆內存使用狀況以及排錯

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

相關文章
相關標籤/搜索