1.使用 top 查看cpu占用情况
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32423 root 20 0 2160292 125968 16692 S 13.6 15.0 0:30.92 java
1766 root 20 0 159824 2140 1552 S 1.0 0.3 1:44.98 sshd
4773 systemd+ 20 0 1354560 49724 10208 S 1.0 5.9 1:13.72 mysqld
32715 root 20 0 64076 4708 3952 R 0.7 0.6 0:00.10 top
771 root 16 -4 47844 24 0 S 0.3 0.0 0:03.66 sedispatch
910 root 20 0 9768 2716 2408 S 0.3 0.3 0:00.01 bash
1996 root 20 0 64796 1664 464 S 0.3 0.2 1:11.67 top
31165 root 20 0 0 0 0 I 0.3 0.0 0:00.04 kworker/0:2-ata_sff
1 root 20 0 180868 4384 2952 S 0.0 0.5 0:05.26 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
可以看到我们占用最高的pid是32423
2.然后输入 top -Hp 32423 查看 详细进程
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3643 root 20 0 2160292 128484 16692 R 85.1 15.3 1:03.22 java
32425 root 20 0 2160292 128484 16692 S 1.0 15.3 0:02.22 java
32423 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.00 java
32424 root 20 0 2160292 128484 16692 S 0.0 15.3 0:11.50 java
32426 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.04 java
32427 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.06 java
32428 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.00 java
32429 root 20 0 2160292 128484 16692 S 0.0 15.3 0:15.96 java
32430 root 20 0 2160292 128484 16692 S 0.0 15.3 0:03.47 java
32431 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.00 java
32432 root 20 0 2160292 128484 16692 S 0.0 15.3 0:00.11 java
可以看到我们占用最高的3643
用 printf("$x\n") 3643 来查看该进程的16进制, 然后再使用jstack -l 32423 |grep e3b -C 20 定位出问题点
[root@10 testapp]# printf "%x\n" 3643
e3b
[root@10 testapp]# jstack -l 32423 |grep e3b -C 20
2020-08-17 13:28:15
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode):
"Attach Listener" #31 daemon prio=9 os_prio=0 tid=0x00007f3408004800 nid=0x3c82 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-2" #30 daemon prio=5 os_prio=0 tid=0x00007f342c29d800 nid=0xe3b runnable [0x00007f33ff7fa000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000000f77a25e0> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked <0x00000000f7785748> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x00000000f7785730> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.newLine(PrintStream.java:546)
- eliminated <0x00000000f7785748> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:807)
- locked <0x00000000f7785748> (a java.io.PrintStream)
at com.example.shirodemo.controller.TestController$Worker.run(TestController.java:34)
at java.lang.Thread.run(Thread.java:748)
4.可以看出是testcontroller的run方法出现问题,且大约在34行.