dump文件怎么查看 打開dump文件的操作步驟

在日常開發中,即使代碼寫得有多謹慎,免不了還是會發生各種意外的事件,比如服務器內存突然飆高,又或者發生內存溢出(OOM) 。當發生這種情況時,我們怎么去排查,怎么去分析原因呢?
這時就引出這篇文章要講的dump文件,各位看官且往下看 。
什么是dump文件dump文件是一個進程或者系統在某一個給定的時間的快照 。
dump文件是用來給驅動程序編寫人員調試驅動程序用的,這種文件必須用專用工具軟件打開 。
dump文件中包含了程序運行的模塊信息、線程信息、堆棧調用信息、異常信息等數據 。
在服務器運行我們的Java程序時,是無法跟蹤代碼的,所以當發生線上事故時,dump文件就成了一個很關鍵的分析點 。
如何生成dump文件這里介紹兩種方式,一種是主動的,一種是被動的 。
方式一主動生成dump文件 。首先要查找運行的Java程序的pid 。
使用top命令:

dump文件怎么查看 打開dump文件的操作步驟

文章插圖
然后使用jmap命令生成dump文件 。file后面是保存的文件名稱,1246則是java程序的PID 。
jmap -dump:format=b,file=user.dump 1246
dump文件怎么查看 打開dump文件的操作步驟

文章插圖
方式二其實在很多時候我們是不知道何時會發生OOM,所以需要在發生OOM時自動生成dump文件 。
其實很簡單,只需要在啟動時加上如下參數即可 。HeapDumpPath表示生成dump文件保存的目錄 。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\tmp我們還需要模擬出OOM錯誤,以此觸發產生dump文件,首先寫個接口:
private static Map map = new HashMap();@RequestMapping(\"/oom\")public String oom() throws Exception {for (int i = 0; i < 100000; i++) {map.put(\"key\" + i, \"value\" + i);}return \"oom\";}然后在啟動時設置堆內存大小為32M 。
-Xms32M -Xmx32M因為要后臺啟動,并且輸出日志,所以最后啟動命令就是這樣:
nohup java -jar -Xms32M -Xmx32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local user-0.0.1-SNAPSHOT.jar> log.file2>&1 &然后請求oom的接口,查看日志,果然發生了OOM錯誤 。
dump文件怎么查看 打開dump文件的操作步驟

文章插圖
查看保存dump的目錄,果然生成了對應的dump文件 。
dump文件怎么查看 打開dump文件的操作步驟

文章插圖
如何查看dump文件這里我介紹使用Jprofiler,有可視化界面,功能也比較完善,能夠打開JVM工具(通過-XX:+HeapDumpOnOutOfMemoryError JVM參數觸發)創建的hporf文件 。
安裝過程這里就省略了,網上谷歌,百度自行查找 。我們把剛剛自動生成的java_pid1257.hprof用Jprofiler打開,看到是這個樣子 。
dump文件怎么查看 打開dump文件的操作步驟

文章插圖
明顯可以看出HashMap的Node對象,還有String對象的實例很多,占用內存也是最多的 。這里還不夠明顯,我們看Biggest Objects 。
dump文件怎么查看 打開dump文件的操作步驟

文章插圖
這里就看出是UserController類的HashMap占用了大量的內存 。所以造成OOM的原因不難看出,就是在UserController里的Map集合 。
總結當然線上的代碼量,類的數量,實例的數量都非常龐大,所以沒有那么簡單就能找出報錯的原因,但是要用什么工具,怎么用至少要知道,那么當遇到問題時,才不會慌張 。
我問過一些技術大佬,為什么技術大佬代碼寫得不是很多,但是工資卻特別高 。大佬說,那是因為當線上出現問題時,大佬能解決大家解決不了的問題,這種能力就體現出他個人的價值 。
【dump文件怎么查看 打開dump文件的操作步驟】一句話講完,業務代碼大部分程序員都會寫,而線上排錯能力并不是大部分程序員都會排 。

    推薦閱讀