这几天碰到的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的目录下执行。
分享到:
相关推荐
"Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,服务器端通过一个线程处理一个客户端的请求,当请求被...
在服务端应用程序的主线程中不停的调用accept操作,以使服务端程序能不停地接受客户端程序发送...详见链接:Winsocket 二:多线程阻塞服务器程序(tcp),http://blog.csdn.net/u013071074/article/details/26340707
"普通的SOCKET多线程阻塞模型"是指使用标准的Socket接口,结合多线程技术实现的一种通信模型,它广泛应用于VC(Visual C++)开发环境中。在这一模型中,每个线程负责处理一个连接,当线程在进行读写操作时,如果数据...
本实验“winsock多线程阻塞通信”主要关注如何在多线程环境中使用Winsock进行阻塞式的网络通信,这是一种基础但重要的编程技术,尤其在服务器端编程中广泛应用。 首先,我们要理解什么是阻塞与非阻塞模式。阻塞模式...
本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步方法调用是传统的调用方式,当一个线程调用一个函数,如`Foo()`,它会等待...
在标题和描述中提到的“实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)”是一个典型的并发编程问题,涉及到线程管理和通信。以下是对这个主题的详细讲解: 1. **线程与并发**: - 线程是程序执行的最小...
本文将深入探讨标题和描述中提到的“多线程阻塞式网络编程socket”相关的知识点。 首先,我们需要理解“socket”。Socket是操作系统提供的一个接口,允许应用程序进行网络通信。它就像一个通信端口,通过它可以发送...
本篇将深入探讨“单线程阻塞TCP Server&Client程序”的相关知识点。 首先,我们来理解“单线程”概念。在计算机程序中,线程是程序执行的最小单位,一个进程可以有多个线程。单线程意味着整个程序只有一个执行线程...
本视频教程“010_android 之UI线程阻塞及其优化”深入探讨了这一主题,下面是对相关知识点的详细解析。 一、UI线程的重要性 Android系统为了保证用户界面的流畅性,规定所有的UI操作都必须在UI线程中执行。这是因为...
本示例旨在介绍如何在TCP协议的客户端和服务器端实现多线程阻塞模式,这对于初学者理解网络编程的原理及其应用是非常有价值的。 首先,让我们理解什么是阻塞模式。在TCP编程中,阻塞模式意味着当一个线程调用recv或...
这篇我们将深入探讨`AsyncTask`的基本概念和工作原理,以及如何避免线程阻塞。 `AsyncTask`主要包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表任务的输入参数类型、后台执行过程中的进度类型和最终...
本教程主要探讨的是如何在Java中使用Socket实现多线程阻塞式通信,这通常涉及到服务器端(EchoServer)和客户端(EchoClient)的设计。在本文中,我们将详细解析`EchoServer.java`、`SocketUtils.java`和`EchoClient...
我们经常会进行一些比较复杂的计算和算法实现,或者是在某些特定的情况下会实例化一些类。...可以通过开启子线程,将复杂计算内容交给子线程来处理,主线程主要进行UI的渲染操作,这样同样能够解决线程阻塞的问题。
读书笔记:C#网络编程与JAVA网络通信。TCP, UDP的Socket编程多线程阻塞非阻塞等。
在软件开发中,尤其是涉及到用户界面(UI)的应用程序,线程阻塞是一个常见的性能问题。线程阻塞指的是一个线程在等待某个条件满足或资源释放时,无法继续执行的状态。这通常会导致应用程序响应变慢,甚至出现卡顿、...
阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单
然而,当你设置`async: false`时,`AJAX`请求会变成同步的,这会导致一些潜在的问题,就像你在项目中遇到的UI线程阻塞问题。 同步`AJAX`请求意味着JavaScript引擎会等待该请求完成才会继续执行后续的代码。在这种...
用MFC实现串口编程, 本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC ...并给出用Visual C++6.0 编写的相应MFC32位应用程序。...API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.
在Java多线程编程中,LockSupport类是一个重要的工具,它提供了一种低级别的线程阻塞和唤醒机制。LockSupport并不像synchronized或java.util.concurrent.locks包中的Lock接口那样提供锁的完整功能,但它提供了两个...