02 jmap+MAT(內存溢出)、jstack(線程、死循環、死鎖)


jmap+MAT

詳情參考jmap 官方文檔

內存溢出演示:
最終代碼: monitor_tuning
為快速產生內存溢出,右擊 Run As>Run Configurations, Arguments 標簽VM arguments 中填入
-Xmx32M -Xms32M

 

–XX:MetaspaceSize=32M –XX:MaxMetaspaceSize=32M(同時在 pom.xml 中加入 asm 的依賴)

訪問 http://localhost:8080/nonheap

內存溢出自動導出

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
右擊 Run As>Run Configurations, Arguments 標簽VM arguments 中填入
-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
可以看到自動在當前目錄中生成了一個java_pid660.hprof文件
另一種導出溢出也更推薦的方式是jmap

 

option: -heap, -clstats, -dump:<dump-options>, -F
jmap -dump:format=b,file=heap.hprof <pid>
 
JAVA生產環境性能監控與調優

MAT下載地址:http://www.eclipse.org/mat/

找開上述導出的內存溢出文件即可進行分析,如下圖的溢出源頭分析:

JAVA生產環境性能監控與調優

jstack

詳情參考 jstack 官方文檔

jstack <pid>

可查看其中包含java.lang.Thread.State: WAITING (parking),JAVA 線程包含的狀態有:

NEW:線程尚未啟動

RUNNABLE:線程正在 JVM 中執行

BLOCKED:線程在等待監控鎖(monitor lock)

WAITING:線程在等待另一個線程進行特定操作(時間不確定)

TIMED_WAITING:線程等待另一個線程進行限時操作

TERMINATED:線程已退出

JAVA生產環境性能監控與調優

monitor_tuning中新增CpuController.java

mvn clean package -Dmaven.test.skip

mvn 打包提速參考 CSDN

此時會生成一個monitor_tuning-0.0.1-SNAPSHOT.jar的 jar包,為避免本地的 CPU 消耗過多導致死機,建議上傳上傳到虛擬機進行測試

nohup java -jar monitor_tuning-0.0.1-SNAPSHOT.jar &

訪問 http://xx.xx.xx.xx:12345/loop(端口12345在application.properties文件中定義)

top -p <pid> -H可以查看線程及 CPU 消耗情況

JAVA生產環境性能監控與調優

使用 jstack <pid>可以導出追蹤文件,文件中 PID 在 jstack 中顯示的對應 nid 為十六進制(命令行可執行 printf ‘%x’ <pid>可以進行轉化,如1640對應的十六進制為668)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM