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进制表示