借助线程堆栈,可以分析很多类型的问题,CPU的消耗分析即是线程堆栈分析的一个重要内容;
处于TIMED_WAITING、WAITING状态的线程一定不消耗CPU。处于RUNNABLE的线程,要结合当前代码的性质判断,是否消耗CPU。
如果是纯Java运算代码,则消耗CPU。

如果是网络IO,很少消耗CPU。
如果是本地代码,要结合本地代码的性质判断(可以通过pstack、gstack获取本地线程堆栈),如果是纯运算代码,则消耗CPU,如果被挂起,则不消耗CPU,如果是IO,则不怎么消耗CPU。
线程堆栈在定位如下类型的问题上非常有帮助:
线程死锁的分析
Java代码导致的CPU过高分析
死循环分析
资源不足分析
性能瓶颈分析
死锁的概念就不做过多解释了,不明白的可以去网上查查;
两个或超过两个线程因为环路的锁依赖关系而形成的锁环,就形成了真正的死锁,如下为死锁喉打印的堆栈:
Found one Java-level deadlock:
=============================
"org.ccgogoing.study.stacktrace.deadlock.TestThread2":
waiting to lock monitor 0x000000000a9ad118 (object 0x00000000d77363d0, a java.lang.Object),
which is held by "org.ccgogoing.study.stacktrace.deadlock.TestThread1"
"org.ccgogoing.study.stacktrace.deadlock.TestThread1":
waiting to lock monitor 0x000000000a9abc78 (object 0x00000000d77363e0, a java.lang.Object),
which is held by "org.ccgogoing.study.stacktrace.deadlock.TestThread2"
Java stack information for the threads listed above:
===================================================
"org.ccgogoing.study.stacktrace.deadlock.TestThread2":
at org.ccgogoing.study.stacktrace.deadlock.TestThread2.fun(TestThread2.java:35)
- waiting to lock <0x00000000d77363d0> (a java.lang.Object)
- locked <0x00000000d77363e0> (a java.lang.Object)
at org.ccgogoing.study.stacktrace.deadlock.TestThread2.run(TestThread2.java:22)
"org.ccgogoing.study.stacktrace.deadlock.TestThread1":
at org.ccgogoing.study.stacktrace.deadlock.TestThread1.fun(TestThread1.java:33)
- waiting to lock <0x00000000d77363e0> (a java.lang.Object)
- locked <0x00000000d77363d0> (a java.lang.Object)
at org.ccgogoing.study.stacktrace.deadlock.TestThread1.run(TestThread1.java:20)
Found 1 deadlock.
从打印的堆栈中我们能看到"Found one Java-level deadlock:",即如果存在死锁情况,堆栈中会直接给出死锁的分析结果.
当一组Java线程发生死锁的时候,那么意味着Game Over,这些线程永远得被挂在那里了,永远不可能继续运行下去。当发生死锁的线程在执行系统的关键功能时,那么这个死锁可能会导致整个系统瘫痪,要想恢复系统,临时也是唯一的规避方法是将系统重启。然后赶快去修改导致这个死锁的Bug。
注意:死锁的两个或多个线程是不消耗CPU的,有的人认为CPU100%的使用率是线程死锁导致的,这个说法是完全错误的。死循环,并且在循环中代码都是CPU密集型,才有可能导致CPU的100%使用率,像socket或者等IO操作是不怎么消耗CPU的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-55880-3.html
那干嘛南方芝麻糊赔两包芝麻糊