这几天碰到的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的目录下执行。
分享到:
相关推荐
在服务端应用程序的主线程中不停的调用accept操作,以使服务端程序能不停地接受客户端程序发送...详见链接:Winsocket 二:多线程阻塞服务器程序(tcp),http://blog.csdn.net/u013071074/article/details/26340707
最普通的Socket多线程阻塞通信模型
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2114621
010_android 之UI线程阻塞及其优化视频教材,讲解的比较详细,有兴趣的可以学习下哦。
winsock多线程阻塞网络通信源码,经典实验
实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒),
单线程阻塞server&client程序(tcp),学习tcp的简单实例。博客链接:http://blog.csdn.net/u013071074/article/details/26293303
socket源代码, 多线程阻塞式网络编程socket_源代码, 客户端和服务端为多线程编程, 转载其他源代码。
AsyncTask_演示线程阻塞,对应我的博客《Android专题之AsyncTask(一)基本概念介绍》,有问题欢迎留言讨论。
TCP协议的客户端和服务器端多线程阻塞模式的简单例子 是新手练习的好程序,代码注释丰富,容易理解,希望 能够帮助到你!~
Winsocket入门教程一多线程阻塞式服务器和阻塞式客户.doc
我们经常会进行一些比较复杂的计算和算法实现,或者是在某些特定的情况下会实例化一些类。...可以通过开启子线程,将复杂计算内容交给子线程来处理,主线程主要进行UI的渲染操作,这样同样能够解决线程阻塞的问题。
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
后玩委托、 线程和异步调用的这么久,这是一种罪恶不分享我的智慧和知识对这个问题的一些因此希望,你 won�t 找一个 MSDN 文章在 1 AM 不知道为什么在你决定去到计算机。 我会尝试使用婴儿步骤和大量的 examples�...
UI线程阻塞 及优化 及结局方案 test01 test02两个阻塞造成的卡顿及报错问题 后更两种解决方案 详情 仔细阅读代码
最近做一个项目,遇到了一个问题同步ajax引起的ui线程阻塞问题,下面把我的问题解决过程分享给大家。 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData...
1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单
用MFC实现串口编程, 本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC ...并给出用Visual C++6.0 编写的相应MFC32位应用程序。...API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2114632
俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下。 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我...