简介
最近公司API项目经常CPU爆满。排除下问题。做下记录。
编写一下代码
public class JVMCPU {
public static void main(String[] args) {
fun1();
}
public static void fun1() {
fun2();
}
public static void fun2() {
long n = 1;
long sum = 1;
while (true) {
sum *= n;
n++;
if (n == 18) ;
{
n = 1;
}
}
}
}
编译运行
javac JVMMCPU.java
java JVMCPU
dump线程堆栈
123 为 进程ID
jstack -l 123 > 123.txt
windows
windows 任务管理器只能查看占用高的进程,需要Process Explorer工具查看进程中CPU占用高的线程。
获取到 线程ID
linux
top
查看 CPU使用率高的进程ID
top -H -p 123
查看CPU使用率高的线程ID
把10进制线程ID转换为16进制
分析
线程ID 0x26ec
dump出来的文件内容
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000017e09000 nid=0x1c18 in Object.wait() [0x00000000190af000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d5f06af8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
- locked <0x00000000d5f06af8> (a java.lang.ref.Reference$Lock)
Locked ownable synchronizers:
- None
"main" #1 prio=5 os_prio=0 tid=0x0000000003211000 nid=0x26ec runnable [0x000000000320f000]
java.lang.Thread.State: RUNNABLE
at JVMCPU.fun2(JVMCPU.java:21)
at JVMCPU.fun1(JVMCPU.java:10)
at JVMCPU.main(JVMCPU.java:6)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 tid=0x0000000017e08000 nid=0xdc0 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003226800 nid=0x1a8c runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000003228000 nid=0x54 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000322a000 nid=0x1b88 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000322b800 nid=0x1a50 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x0000000019576000 nid=0x2478 waiting on condition
查看代码可以看到在fun2方法中有大量的计算