java内存溢出排查jstack_02 jmap+MAT(内存溢出)、jstack(线程、死循环、死锁)

jmap+MAT

内存溢出演示:

为快速产生内存溢出,右击 Run As>Run Configurations, Arguments 标签VM arguments 中填入

-Xmx32M -Xms32M

Exception in thread "http-nio-8080-exec-2" Exception in thread "http-nio-8080-exec-1"java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError: Java heap space

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

Exception in thread "main"java.lang.OutOfMemoryError: Metaspace

Exceptionin thread "ContainerBackgroundProcessor[StandardEngine[Tomcat]]" java.lang.OutOfMemoryError: Metaspace

内存溢出自动导出

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./

右击 Run As>Run Configurations, Arguments 标签VM arguments 中填入

-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

可以看到自动在当前目录中生成了一个java_pid660.hprof文件

java.lang.OutOfMemoryError: GC overhead limit exceeded

Dumping heap to ./java_pid660.hprof ...

另一种导出溢出也更推荐的方式是jmap

option: -heap, -clstats, -dump:, -F

jmap -dump:format=b,file=heap.hprof

abc3633bb8cc200bc682153a17e50a0d.png

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

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

51835c6d07a4bedfe820e5dd609f537e.png

jstack

jstack

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

NEW:线程尚未启动

RUNNABLE:线程正在 JVM 中执行

BLOCKED:线程在等待监控锁(monitor lock)

WAITING:线程在等待另一个线程进行特定操作(时间不确定)

TIMED_WAITING:线程等待另一个线程进行限时操作

TERMINATED:线程已退出

264ccf37bd1bcbdfbc4b8c3dfabf9f52.png

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 &

top -p -H可以查看线程及 CPU 消耗情况

0f428f165f98d59e5c19947efaac2040.png

使用 jstack 可以导出追踪文件,文件中 PID 在 jstack 中显示的对应 nid 为十六进制(命令行可执行 printf ‘%x’ 可以进行转化,如1640对应的十六进制为668)

"http-nio-12345-exec-3" #18 daemon prio=5 os_prio=0 tid=0x00007f10003fb000 nid=0x668 runnable [0x00007f0fcf8f9000]

java.lang.Thread.State: RUNNABLE

at org.alanhou.monitor_tuning.chapter2.CpuController.getPartneridsFromJson(CpuController.java:77)

访问http://xx.xx.xx.xx:12345/deadlock(如上jstack 导出追踪记录会发现如下这样的记录)

Java stack information forthe threads listed above:===================================================

"Thread-5":

at org.alanhou.monitor_tuning.chapter2.CpuController.lambda$deadlock$1(CpuController.java:41)- waiting to lock <0x00000000edcf3470>(a java.lang.Object)- locked <0x00000000edcf3480>(a java.lang.Object)

at org.alanhou.monitor_tuning.chapter2.CpuController$$Lambda$337/547045985.run(Unknown Source)

at java.lang.Thread.run(Thread.java:748)"Thread-4":

at org.alanhou.monitor_tuning.chapter2.CpuController.lambda$deadlock$0(CpuController.java:33)- waiting to lock <0x00000000edcf3480>(a java.lang.Object)- locked <0x00000000edcf3470>(a java.lang.Object)

at org.alanhou.monitor_tuning.chapter2.CpuController$$Lambda$336/1704575158.run(Unknown Source)

at java.lang.Thread.run(Thread.java:748)

Found1 deadlock.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值