02 jmap+MAT(内存溢出)、jstack(线程、死循环、死锁)

jmap+MAT

详情参考jmap 官方文档html

内存溢出演示:
最终代码: monitor_tuning
为快速产生内存溢出,右击 Run As>Run Configurations, Arguments 标签VM arguments 中填入
-Xmx32M -Xms32M

 

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

访问 http://localhost:8080/nonheapgit

内存溢出自动导出github

-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/spring

找开上述导出的内存溢出文件便可进行分析,以下图的溢出源头分析:oracle

JAVA生产环境性能监控与调优

jstack

详情参考 jstack 官方文档app

jstack <pid>eclipse

可查看其中包含java.lang.Thread.State: WAITING (parking),JAVA 线程包含的状态有:maven

NEW:线程还没有启动oop

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)

相关文章
相关标签/搜索