作為Java程序員能夠?qū)崟r獲取到線上服務(wù)堆棧信息是一個非常重要的技能,也可以極大幫助我們定位線上問題以及發(fā)現(xiàn)服務(wù)中的隱藏故障。
dump服務(wù)的堆棧信息主要有兩種渠道,分別是自動生成dump文件和手動生成dump文件。
一、自動生成dump文件
顧名思義,當程序中出現(xiàn)內(nèi)存溢出或者gc的時候系統(tǒng)會自動dump出堆棧信息到指定路徑文件中。
為了實現(xiàn)上述功能需要在jvm啟動參數(shù)中添加如下的配置
1. -XX:+HeapDumpOnOutOfMemoryError
當OutOfMemoryError發(fā)生時自動生成 Heap Dump 文件。
當你需要分析Java內(nèi)存使用情況時,往往是在OOM(OutOfMemoryError)發(fā)生時。
2. -XX:+HeapDumpBeforeFullGC
當 JVM 執(zhí)行 FullGC 前執(zhí)行 dump。
3. -XX:+HeapDumpAfterFullGC
當 JVM 執(zhí)行 FullGC 后執(zhí)行 dump。
4. -XX:+HeapDumpOnCtrlBreak
交互式獲取dump。在控制臺按下快捷鍵Ctrl + Break時,JVM就會轉(zhuǎn)存一下堆快照。
5. -XX:HeapDumpPath=/opt/logs/dumplogs
指定 dump 文件的存儲路徑
二、手動生成dump文件
主要的步驟如下:
1.登錄上有問題的機器并獲取到相應(yīng)的root權(quán)限。
2.通過top指令知道需要dump的java進程
3.開始dump文件。命令:jmap -dump:file=文件名.hprof,format=b pid(進程號) 例如:jmap -dump:format=b,file=202104012.hprof 6666
使用自動和手動dump文件的方式會把dump的文件存儲到對應(yīng)的服務(wù)中需要將文件下載到本地進行分析
三、copy dump文件到本地
1.登錄自己的dump文件的服務(wù)器,執(zhí)行 sftp xxx@jumper.xxx.cn,成功后執(zhí)行命令 put 202104012.hprof(dump文件名) 傳輸文件。
2.文件傳輸完成后在本地shell 輸入命令 sftp xxx@jumper.xxx.cn,命令成功后執(zhí)行g(shù)et 202104012.hprof(dump文件名) 拉取文件到本地。
? 拉取文件時需要主要執(zhí)行命令的路徑是存儲文件的位置。
dump文件到本地以后就可以使用mat、Jprofile、visualVM等工具進行分析dump文件了。
最后:打一個小廣告,后續(xù)的文章會在微信公眾號“程序員之家QAQ”推送,歡迎大家搜索關(guān)注~~