jstack 100516

文章插图
"Thread-1":线程名
prio=5: java线程优先级
os_prio:操作系统线程优先级
nid=0x18688 线程对应的本地线程标识nid
java.lang.Thread.State: BLOCKED 线程状态

文章插图
还可以用jvisualvm自动检测到死锁 。

文章插图
找出占用cpu最高的线程堆栈信息
public class Math {public static final int initData = https://www.huyubaike.com/biancheng/666;public static User user = new User();public int compute() {//一个方法对应一块栈帧内存区域int a = 1;int b = 2;int c = (a + b) * 10;return c;}public static void main(String[] args) {Math math = new Math();while (true){math.compute();}}}
1 , 使用命令top -p , 显示你的java进程的内存情况 , pid是你的java进程号 , 比如18963
文章插图
2 , 按H , 获取每个线程的内存情况

文章插图
3 , 找到内存和cpu占用最高的线程tid , 比如18964
4 , 转为十六进制得到 0x4a14 , 此为线程id的十六进制表示
5 , 执行 jstack 18963|grep -A 10 4a14 , 得到线程堆栈信息中 4cd0 这个线程所在行的后面10行 , 从堆栈中可以发现导致cpu飙高的调用方法

文章插图
6 , 查看对应的堆栈信息找出可能存在问题的代码
jstatjstat命令可以查看堆内存各部分的使用量 , 以及加载类的数量 。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
注意:使用的jdk版本是jdk8
整体GC压力情况(常用)
jstat -gc 103784 2000 1000
?可以评估程序内存使用及GC压力整体情况 , 监控gc , 每2000ms打印输出一次 , 输出1000次 。
文章插图
- S0C:第一个幸存区的大小 , 单位KB
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间 , 单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间 , 单位s
- GCT:垃圾回收消耗总时间 , 单位s
jstat -gccapacity 103784

文章插图
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
经验总结扩展阅读
- JVM运行时数据区域详解
- 要写文档了,emmm,先写个文档工具吧——DocMarkdown
- JVM学习笔记——内存模型篇
- jvm双亲委派机制详解
- chrome工具调试
- 万字详解JVM,让你一文吃透
- 怎么破解DLL文件(dll文件反编译工具)
- JVM学习笔记——类加载和字节码技术篇
- 重新整理 .net core 实践篇 ———— linux上排查问题实用工具 [外篇]
- 海边退潮捡海螺技巧