线程阻塞

这几天碰到的report engine的问题,曾经怀疑是线程间死锁,所以也顺带研究了一把检查线程间死锁的方法。
JDK1.4及更早版本,没有更好的方法,就是在停止的命令行界面下敲Ctrl+Break或者Ctrl+\,打印当前的stack trace,然后根据stack trace里面的信息来分析。
JDK1.5及后续版本有个比较大的改进,就是提供了比较好的JMX支持,也提供了诸如jconsole(用于监控线程)和FullThreadDump(用于检查线程间是否有死锁)。
比较复杂的使用方法,可以查看相关文档,这里写一种快速使用的方法,应该是比较常用的。
假设我们要执行的类是com.ebay.datatools.reporting.engine.ReportEngine,它在执行过程中会生成一些线程,然后我们要做的就是监控它的所有线程以及检查这些线程之间是否有死锁。
首先,我们要把执行这个类的命令由:
java com.ebay.datatools.reporting.engine.ReportEngine
改为
java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false com.ebay.datatools.reporting.engine.ReportEngine
区别就是其中添加了三个jmxremote相关的设置。
然后,我们可以直接的命令行下输入jconsole,会出现一个swing做的界面,上面的Port输入1090,用户名/密码留空,就可以和com.ebay.datatools.reporting.engine.ReportEngine的执行进程连接上了。然后就可以看它相关的信息了。
检查死锁的话,就是在命令行下输入:
java -cp FullThreadDump.jar FullThreadDump localhost:1090
FullThreadDump就会开始检查当前活跃的线程之间有没有死锁,并且把检查结果输出。
FullThreadDump的路径是JDK_HOME\demo\management\FullThreadDump,上述命令需要在FullThreadDump的目录下执行。

你可能感兴趣的:(jdk,swing,sun)