浏览 28220 次
锁定老帖子 主题:使用jstack分析cpu消耗过高的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-31
1.top查找出哪个进程消耗的cpu高 21125 co_ad2 18 0 1817m 776m 9712 S 3.3 4.9 12:03.24 java 5284 co_ad 21 0 3028m 2.5g 9432 S 1.0 16.3 6629:44 java 21994 mysql 15 0 449m 88m 5072 S 1.0 0.6 67582:38 mysqld 8657 co_sparr 19 0 2678m 892m 9220 S 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 9492 S 1.3 4.0 0:05.12 java 20503 co_ad2_s 15 0 1360m 560m 9176 S 0.3 3.6 0:46.72 java 21134 co_ad2 15 0 1807m 630m 9492 S 0.3 4.0 0:00.72 java 22673 co_ad2 15 0 1807m 630m 9492 S 0.3 4.0 0:03.12 java 这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。 3.jstack查找这个线程的信息 jstack [进程]|grep -A 10 [线程的16进制] 即: jstack 21125|grep -A 10 52f1 -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) 说不定可以一下子定位到出问题的代码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-31
可实施程度不高,明显的死循环找出来容易,遇到线程切换很频繁的应用,基笨无用。
|
|
返回顶楼 | |
发表时间:2011-08-31
嘛,有招总比没有好,至少能试试看。
用这招解决过的一个问题的笔记:https://gist.github.com/1081908#file_notes.md |
|
返回顶楼 | |
发表时间:2011-08-31
RednaxelaFX 写道 嘛,有招总比没有好,至少能试试看。 用这招解决过的一个问题的笔记:https://gist.github.com/1081908#file_notes.md 好吧。我还土的自己用十进制去算。。。 linux'命令不太熟伤不起。 不过原理跟我之前用的差不多。 |
|
返回顶楼 | |
发表时间:2011-08-31
lifeforever 写道 可实施程度不高,明显的死循环找出来容易,遇到线程切换很频繁的应用,基笨无用。
我之前遇到的一个情况是,并发太高,造成程序启用的http请求太多,连接池处理不了,很多http请求一直在runnable状态,造成cpu一直保持到高位。通过这种方法,就可以找出是哪些代码启用了这么多的http请求。 造成cpu飙高,很大一部分原因都是线程一直在运行或者等待造成的。如果线程切换很频繁,但每个线程都得到了很好的执行,即使cpu消耗很高,说明cpu利用率很高,程序很健康。但cpu一直保持高位甚至99%的时候,基本都是线程有问题了一直在运行。此时这些线程通过这种方法是很容易找出来的。 |
|
返回顶楼 | |