JVM(三)--jstack实战死循环与死锁
(一)1、demo
package com.gisquest.zrzy.platform.client.frmdept;
import com.gisquest.realestate.vo.ResponseBodyVo;
import com.gisquest.realestate.vo.ResponseStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Description : jstack实战死循环与死锁
* @Auth : Xuhy
* @Date : 2019-01-23
* @Time : 09:45
*/
@Controller
public class DemoCtrl {
private Object lock1 = new Object();
private Object lock2 = new Object();
/**
* 死锁
* PS:Thread1中想要获取的locak2已经被 Thread2占有了
* Thread2中想要获取的locak1已经被 Thread1占有了
*
* @param
* @return
* @date 2019-01-23 09:04
*/
@GetMapping("/deadlock")
public
@ResponseBody
ResponseBodyVo<String> read() {
new Thread(() -> {
synchronized (lock1) {
try {Thread.sleep(1000);} catch (Exception e) {}
synchronized (lock2){
System.out.println("Thread1 over");
}
}
}).start();
new Thread(() -> {
synchronized (lock2) {
try {Thread.sleep(1000);} catch (Exception e) {}
synchronized (lock1){
System.out.println("Thread2 over");
}
}
}).start();
return new ResponseBodyVo<>(ResponseStatus.OK,"deadlock");
}
}
2、返回结果
{
"status": 200,
"msg": "deadlock",
"code": "0"
}
PS:结果能正常返回,里面只是启动了两个子线程,不影响主线程“deadlock"的返回!
那这个问题我们如何利用jstack进行定位?
(二)1、查看进程ID
ps -ef | grep java
2、返回结果
3、下载JVM详细信息
jstack 23674 > 23674.txt
sz 23674.txt
4、文件详情