①使用top查出java进程的pid,如3707
②使用top -p 14292 -H观察该进程中所有线程的CPU占用。
如图所示
③找出CPU消耗较多的线程id,如1602,将1602转换为16进制642
④使用jstack 14292|grep -A 10 0x3de4来查询出具体的线程状态
[root@cp01-game-dudai-0100.cp01.baidu.com ~]# jstack 14292|grep -A 10 642
"pool-52-thread-1" prio=10 tid=0x000000005a08e000 nid=0x3de4 waiting on condition [0x00002ae63d917000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006f9a0a110> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:662)
关注公众号
每周会更新干货知识