标签: 杂谈 |
我们使用jdk自带的jstack来分析。当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙:
1.top查找出哪个进程消耗的cpu高
21125 co_ad2
18
0 1817m 776m 9712S
3.3
4.9
12:03.24java
5284co_ad
21
0 3028m 2.5g 9432S
1.0 16.3
6629:44java
21994mysql
15
0
449m
88m 5072 S
1.0
0.6
67582:38mysqld
8657 co_sparr 19
0 2678m 892m 9220S
0.3
5.7 103:06.13 java
这里我们分析21125这个java进程。
2.top中shift+h查找出哪个线程消耗的cpu高
先输入top,然后再按shift+h
21233 co_ad2
15
0 1807m 630m 9492S
1.3
4.0
0:05.12java
20503 co_ad2_s 15
0 1360m 560m 9176S
0.3
3.6
0:46.72java
21134 co_ad2
15
0 1807m 630m 9492S
0.3
4.0
0:00.72java
22673 co_ad2
15
0 1807m 630m 9492S
0.3
4.0
0:03.12 java
这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。
3.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制]
即:
-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。
结果:
说不定可以一下子定位到出问题的代码。
1.top查找出哪个进程消耗的cpu高
21125 co_ad2
5284co_ad
21994mysql
8657 co_sparr
这里我们分析21125这个java进程。
2.top中shift+h查找出哪个线程消耗的cpu高
先输入top,然后再按shift+h
21233 co_ad2
20503 co_ad2_s
21134 co_ad2
22673 co_ad2
这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。
3.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制]
即:
-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。
结果:
- "http-8081-11"
daemon prio=10 tid=0x00002aab049a1800 nid=0x52bb in Object.wait() [0x0000000042c75000] -
java.lang.Thread.State: WAITING (on object monitor) -
at java.lang.Object.wait(Native Method) -
at java.lang.Object.wait(Object.java:485) -
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
说不定可以一下子定位到出问题的代码。