jvm线上排查
内存泄露
top free df 三连
若 Java 进程,不做大量 CPU 运算,正常情况下,CPU 应该在 100~200% 之间,出现这种 CPU 飙升的情况,要么走到了死循环,要么就是在做大量的 GC。使用 jstat -gc pid [interval] 命令查看了 java 进程的 GC 状态(果然,FULL GC 达到了每秒一次。)
若确定了内存泄漏,使用 jstack pid > jstack.log (保存线程栈的现场);jmap -dump:format=b,file=heap.bin pid 保存了堆现场。(此后重启机器)
jstat:强大的jvm监控工具,一般用法:jstat [-options] pid interval
它支持的查看项有:
- -class 查看类加载信息
- -compile 编译统计信息
- -gc 垃圾回收信息
- -gcXXX 各区域GC的详细信息 如-gcold
分析栈
grep 'java.lang.Thread.State' jstack.log | wc -l
分析线程状态
grep -A 1 'java.lang.Thread.State' jstack.log | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n
分析堆
使用gzip -6~7 对其进行压缩
使用MAT分析jvm heap (将文件后缀改为.hprof),会提示我们要分析的种类,选择memory leak suspect.