文章目录
1. 查找进程下占用过高CPU的线程
1.1 查找应用对应的pid
jps

1.2 查看哪个线程cpu占用高,确定对应的线程id:
top -H -p <pid>

1.3 计算线程id的十六进制值
printf "%x\n" <thread_id>

1.4 打印线程堆栈内容
jstack <pid> | grep <线程id十六进制值> -A 30
参数: -A 30 表示向下打印30行

2. 高CPU分析 : C2 Compiler Thread
2.1 概念
C2 Compiler 是JVM在server模式下字节码编译器,JVM启动的时候所有代码均处于解释执行模式,当某些代码被执行到一定阈值次数,热点代码就会被 C2 Compiler编译成机器码,执行效率大幅提升。
编译热点代码,C2 Compiler需要频繁占用CPU来运行,当热点代码被编译成机器代码后,C2 Compiler不再长期占用CPU
2.2 .解决方案
(1) 最直接有效的方法是预热。使用压测工具让C2 Compiler预先将热点代码编译成机器码
(2) 设置JVM启动参数:-XX:CICompilerCount=threads默认是2, 可以设置4或6。对于CPU“高而不满”的情况会有用,缩短占用时间
本文介绍如何定位并解决Java应用中CPU占用过高的线程问题,特别是针对C2CompilerThread导致的高负载。包括查找进程PID、识别高CPU线程ID、打印线程堆栈及C2Compiler的工作原理与优化方案。
1499

被折叠的 条评论
为什么被折叠?



