jps或ps -ef|grep java可以看到有哪些java进程,这个不用说了。

但值得一提的是jps命令是依赖于/tmp下的某些文件的。 而某些操作系统,定期会清理掉/tmp下的文件,导致jps无法查看到实际存在的java进程。不过jstat, jstack等命令也同样如此,所以当jps列不出进程的时候,这些命令也都不能用了。不在我们此次讨论范围之内。


top -p $pid -H  加上-H这个参数后,会列出有哪些线程。这样就可以看到哪个线程id最消耗系统资源了。

看到的线程id是10进制的数字。


jstack $pid 可以打印出制定java进程的stack状况。


将前边top命令看到的线程id转为16进制显示,就可以在jstack的结果中找到它了。


例如以下:

"pool-2-thread-1" prio=10 tid=0x000000004c9b2000 nid=0x11f4 waiting on condition [0x0000000042f36000]

   java.lang.Thread.State: WAITING (parking)

        at sun.misc.Unsafe.park(Native Method)

        - parking to wait for  <0x0000000580089050> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)

        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)



其中的“nid=0x11f4 ”, 11f4就是线程id的16进制表示