We can get the concept of deadlock in wikipedia.
The picture below gives a common scenario which leads to deadlock.
In this blog, I will share how to detect deadlock situation using JDK standard tool jstack. First we have to write a Java program which will lead to Deadlock:
package thread;
public class DeadLockExample {
/*
* Thread 1: locked resource 1
Thread 2: locked resource 2
*/
public static void main(String[] args) {
final String resource1 = "ABAP";
final String resource2 = "Java";
// t1 tries to lock resource1 then resource2
Thread t1 = new Thread() {
public void run() {
synchronized (resource1) {
System.out.println("Thread 1: locked resource 1");
try {
Thread.sleep(100);
} catch (Exception e) {
}
synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (resource2) {
System.out.println("Thread 2: locked resource 2");
try {
Thread.sleep(100);
} catch (Exception e) {
}
synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};
t1.start();
t2.start();
}
}
Execute this program, you will get output: Thread 1: locked resource 1 Thread 2: locked resource 2 Then use command jps -l -m to list the process id of this deadlock program. In my example it is 51476:
Just type jstack + process id, and it will display all detailed information about deadlock:
Here the object 0x00000000d6f64988 and 0x00000000d6f649b8represent the two resource String “ABAP” and “Java”.
Update on 2017-03-04 Saturday 10:35PM
how to get the thread state of a long-running application
Suppose you have found a long-running application which has high CPU utilization rate and you would like to know which exactly line is relevant. Use the following code to simulate the long running situation:
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyThread implements Runnable{
private List<Integer> myList;
private Object host;
public MyThread(List<Integer> list, Object object){
this.myList = list;
this.host = object;
}
public void updateListSafe(){
synchronized(this.host){
ArrayList<Integer> safe = new ArrayList<Integer>();
safe.add(1);
}
}
private void updateList(int i){
synchronized(this.host){
myList.add(i);
}
}
@Override
public void run() {
while(true){
updateList(1);
}
}
}
public class MyExecutor {
private ArrayList<Integer> taskList = new ArrayList<Integer>();
private Object object = new Object();
private void launch(){
ExecutorService executorService= Executors.newFixedThreadPool(10);
executorService.execute(new MyThread(taskList, object));
executorService.execute(new MyThread(taskList, object));
}
public static void main(String[] args) {
MyExecutor test = new MyExecutor();
test.launch();
}
}
first find the process id of running application:
then use command jstack 23520 to get the stack trace:
In line 9 and line 18 our application method MyThread.updateList is listed there.
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...
为了识别死锁,可以使用Java的`jstack`命令查看线程堆栈信息,寻找处于"WAITING"或"TIMED_WAITING"状态并且持有锁的线程,如果发现它们都在等待其他线程释放资源,那么可能就存在死锁。 避免死锁的方法有多种,比如...
`jstack` 是JDK自带的一个命令行工具,它能够打印出Java应用程序的线程堆栈信息,包括每个线程的当前状态、调用堆栈、锁定的监视器等。这对于排查线程问题非常有用。 ### 分析CPU占用过高 当Java应用的CPU占用率飙...
死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition(重点关注) 4.等待监控器检查资源,Waiting on monitor 5.暂停,Suspended 6.对象等待中,Object.wait() ...
线程状态是理解Java应用程序性能的关键因素之一。JVM提供了一个强大的工具——`jstack`,用于生成线程堆栈转储,即Thread Dump,帮助开发者洞察线程的运行状态,识别性能瓶颈或死锁等问题。本文将详细探讨Thread ...
Java 多线程之死锁 Java 多线程中的死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于 synchronized 的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个...
【描述】:jstack命令用于生成Java应用程序的线程堆栈跟踪,它可以帮助开发者诊断Java应用中的线程问题。线程Dump日志提供了详细的线程状态和调用栈信息,这对于理解和解决线程阻塞、死锁等问题至关重要。如果堆栈...
`jstack`命令是Java开发中用于诊断线程堆栈信息的重要工具,它可以帮助开发者了解Java应用程序的线程状态,包括运行、等待、阻塞等,以及是否存在死锁等问题。当遇到性能问题或者线程卡住不前时,`jstack`能提供关键...
此外,Java提供了一些内置工具帮助检测和诊断死锁,如`jstack`命令行工具,它能够打印出Java线程的堆栈跟踪,帮助开发者识别死锁状态。JDK的`jconsole`或`VisualVM`也可以提供可视化的线程监控,帮助识别和分析潜在...
Java提供了一些工具和策略来预防和检测死锁,如使用`jstack`命令查看线程状态。 6. **线程池**: - 为提高性能和管理资源,Java提供了`ExecutorService`和`ThreadPoolExecutor`。线程池可以复用已创建的线程,减少...
Java提供`java.lang.Thread.State`枚举中的`DEADLOCK`状态来检测死锁,并且可以通过`jstack`命令进行分析。 5. **内存模型**:Java内存模型(JMM)规定了线程如何访问和修改共享变量,以及如何保证可见性和一致性。...
例如,JVM的线程监控工具(如jstack、jconsole等)的使用,以及如何利用线程 dump 文件分析死锁等问题。 总的来说,Java高并发编程是一门深奥且实用的技术,通过本教程的学习,你将能够系统地掌握Java并发的理论与...
12. **死锁检测(Deadlock Detection)**:JDK 5.0提供了`jstack`工具,可以检测并报告线程的死锁情况。 13. **NIO(New IO)**:非阻塞I/O模型,提高了读写效率,特别是在处理大量并发连接时。 14. **枚举类的...
- 使用`jstack`获取线程堆栈信息。 - 分析线程堆栈,确认是否存在死锁。 - 修改代码逻辑,避免出现互相等待的情况。 #### 五、深入分析 ##### 1. **线程状态分析** - **Runnable**:线程正在运行或即将被调度...
使用`jstack`工具可以查看线程堆栈信息,帮助诊断多线程问题。同时,合理设置线程优先级、使用适当的同步机制、优化线程池大小等也是提升多线程性能的重要手段。 Java多线程的学习涵盖了并发编程的基础和高级概念...
Java 2 SDK,也被称为Java Development Kit (JDK),是Java编程语言的核心组成部分,它包含了开发者需要的一切工具和资源来构建、测试和部署Java应用程序。JDK 5.0是这个平台的一个重要版本,它引入了许多创新特性,...
九、死锁检测与线程调试工具(Deadlock Detection and Thread Debugging Tools) JDK 5.0加强了对多线程的支持,提供了一些新的工具,如jstack,用于分析线程状态,帮助开发者调试和解决死锁等问题。 十、内省增强...
Java提供了一些工具如jstack,帮助开发者诊断和解决死锁问题。 8. 中断(Interrupt): Java提供了中断机制,允许一个线程中断另一个线程。通过调用`interrupt()`方法标记线程为中断状态,线程在检查到中断标志时...
- **使用诊断工具:** 使用jstack等工具来帮助诊断死锁问题。 **5.2 问题:** "ConcurrentModificationException" **解决:** 当在遍历集合的同时对其进行修改时,会引发这个异常。可以通过以下方式解决: - **使用...
同时,也可以使用 jstack 工具来检测死锁问题的出现。 Spring 容器初始化遇到的死锁问题可以通过避免在 afterPropertiesSet() 方法中开启线程,使用异步执行机制来解决。同时,需要注意线程的执行机制和锁机制,以...