共计 4097 个字符,预计需要花费 11 分钟才能阅读完成。
1.Java 程序
import java.io.Serializable; | |
public class Test {public static void main(String[] args) throws InterruptedException {while (true){ // 始终循环创立 User 对象 | |
User user = new User(); | |
user.userName1 = "username1"; | |
user.userName2 = "userName2"; | |
user.userName3 = "userName3"; | |
user.userName4 = "userName4"; | |
user.userName5 = "userName5"; | |
user.userName6 = "userName6"; | |
user.userName7 = "userName7"; | |
user.userName8 = "userName8"; | |
} | |
} | |
public static void service(){return;} | |
public static class User implements Serializable { | |
public String userName1; | |
public String userName2; | |
public String userName3; | |
public String userName4; | |
public String userName5; | |
public String userName6; | |
public String userName7; | |
public String userName8; | |
public String userName9; | |
public String userName10; | |
public String userName11; | |
public String userName12; | |
public String userName13; | |
public String userName14; | |
public String userName15; | |
public String userName16; | |
} | |
} |
2.top 命令查看 cpu 占用率
top - 09:56:17 up 1 day, 9:53, 7 users, load average: 1.34, 0.95, 0.77 | |
Tasks: 139 total, 2 running, 137 sleeping, 0 stopped, 0 zombie | |
%Cpu(s): 51.9 us, 3.8 sy, 0.0 ni, 43.6 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st | |
KiB Mem : 3880320 total, 137000 free, 3496672 used, 246648 buff/cache | |
KiB Swap: 2097148 total, 2076660 free, 20488 used. 159388 avail Mem | |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND | |
17679 root 20 0 3665040 32140 15900 S 91.0 0.8 0:18.84 java | |
15862 root 20 0 155032 5624 3936 S 0.7 0.1 0:30.12 sshd | |
24986 root 20 0 4607680 998.2m 12640 S 0.7 26.3 18:24.92 java | |
23783 root 20 0 151708 6408 1112 S 0.3 0.2 6:36.31 redis-sentinel | |
23790 root 20 0 149448 4840 1108 R 0.3 0.1 6:39.38 redis-sentinel | |
25350 root 20 0 4567896 973220 11788 S 0.3 25.1 12:45.53 java | |
25716 root 20 0 4574928 994456 11788 S 0.3 25.6 12:47.27 java | |
28449 root 20 0 155160 5644 3936 S 0.3 0.1 0:22.72 sshd | |
28610 root 20 0 162832 3032 1572 S 0.3 0.1 0:11.98 top | |
30011 root 20 0 155148 5628 3936 S 0.3 0.1 0:13.78 sshd | |
30158 root 20 0 162832 3024 1556 S 0.3 0.1 0:06.20 top | |
1 root 20 0 128104 4568 2736 S 0.0 0.1 0:04.42 systemd | |
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd | |
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H | |
6 root 20 0 0 0 0 S 0.0 0.0 0:09.35 ksoftirqd/0 |
3. 查看过程对应的线程占用 cpu
top -p 23191 -H
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND | |
23192 root 20 0 3665040 30560 15772 R 91.3 0.8 2:06.06 java | |
23191 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.00 java | |
23193 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.01 GC Thread#0 | |
23194 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.00 G1 Main Marker | |
23195 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.00 G1 Conc#0 | |
23196 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.00 G1 Refine#0 | |
23197 root 20 0 3665040 30560 15772 S 0.0 0.8 0:00.01 G1 Young RemSet |
4. 获取 23191 线程堆栈信息
jstack 23191 > 23191.log, 找到对应的高 cpu 占用线程 23192(0x5d54) 线程的状态。能够通过堆栈信息看到是 Test.java 中的问题
"main" #1 prio=5 os_prio=0 cpu=265491.21ms elapsed=290.57s tid=0x00007f5830014800 nid=0x5d54 runnable [0x00007f58384a3000] | |
java.lang.Thread.State: RUNNABLE | |
at Test.main(Test.java:15) |
5. 上述能够通过 top + jstack 进行查找高 cpu 线程和其堆栈信息
也能够通过脚本来实现查问高 cpu 占用线程
wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release-2.x.zip | |
unzip release-2.x.zip | |
github 上的开源脚本 | |
间接执行 | |
/data/java/useful-scripts-release-2.x/bin 中的 | |
show-busy-java-threads 脚本即可查看,默认显示前 5 名线程 |
后果
[1] Busy(90.4%) thread(14366/0x381e) stack of java process(14365) under user(root): | |
"main" #1 prio=5 os_prio=0 cpu=16787.88ms elapsed=18.53s tid=0x00007f4964014800 nid=0x381e runnable [0x00007f496dc9f000] | |
java.lang.Thread.State: RUNNABLE | |
at Test.main(Test.java:15) | |
[2] Busy(0.0%) thread(14365/0x381d) stack of java process(14365) under user(root): | |
[3] Busy(0.0%) thread(24040/0x5de8) stack of java process(24040) under user(root): | |
[4] Busy(0.0%) thread(24043/0x5deb) stack of java process(24040) under user(root): | |
"main" #1 prio=5 os_prio=0 cpu=787.79ms elapsed=121813.53s tid=0x00007f9e9c015000 nid=0x5deb in Object.wait() [0x00007f9ea6296000] | |
java.lang.Thread.State: WAITING (on object monitor) | |
at java.lang.Object.wait(java.base@11.0.7/Native Method) | |
- waiting on <0x00000000c631f8a0> (a org.apache.zookeeper.server.quorum.QuorumPeer) | |
at java.lang.Thread.join(java.base@11.0.7/Thread.java:1305) | |
- waiting to re-lock in wait() <0x00000000c631f8a0> (a org.apache.zookeeper.server.quorum.QuorumPeer) | |
at java.lang.Thread.join(java.base@11.0.7/Thread.java:1379) | |
at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:171) | |
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:114) | |
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81) | |
[5] Busy(0.0%) thread(24098/0x5e22) stack of java process(24098) under user(root): |
正文完