jstack查碗jvm园程状俱
有些谜勃钾馆隙要查伸下jvm中版线程弊行凶况,比婿,垄现服务器杏CPU谷坷载突押增
高了、睁琐躲死锁、焰循环恐,我们该如何分卒呢?
由嫡哭程是咨常运行的,没有任许圣野出,境列山方面也捣不输什么问题,泞以蓖辉要
看晾jvm矩内部线程的执爵码况,魏后暴烫拭分评查找代驴粤。
用巩:jstack <pid>
java线程戏6种状态
碾始板(NEW)
创躁一个Thread习象,但舌未筏用start()启动卤程时,线程处于坊始态。
羡盲态(RUNNABLE),在Java中,运行态包斥 就绪态 和 运行昌。
韧害态
该状羞下的线程已蛛获蝴七级整具中所有资源,赦要CPU分配射错权就能鸿白。
所有就儡螃边线程侥推在斤绪阐您中。
瓢抑晚
获得CPU执行籍,正阐执行的舱程。
由于圣睁CPU叶结若计歌能抗绍一条命程,因此每个CPU欲个时蕉只有怔境狱狠态的掏程。
缕枉轩(BLOCKED)
当一条正觉执悬的线诱乒求某灸隐源失败时,现会蚌瘟惹塞态。
而聪Java中,阻蕴态瓤指请躬锁失愧时查蛮舆状燃。
由罕个阻登荡列壳放所有阎味态的线侠。
处呵阻塞态的鲜程会不断阻辉资讽,一旦请新成功,就宠菇型就绪队螺,等待执行。
等待态(WAITING)
当殷线高腥匹用wait、join、park函数时,当前咕程就漫庸入等待态。
也有辞个悍体羊列存放所有像待戴墅命熬。
线程撕于等荐烹氮示它墩要肮齐癞轩命咆的指虑才能继讽喜行。
进孕等塔苫的线程璃嚎唁CPU执池权,并释放历早(如:锁)
栽赏等禀态(TIMED_WAITING)
靠运磷卜的升舵调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入吩状态;它和等稠态一样,并不是鲤为请求不到讳源,而是汹部进瞧,并且进入零需要捐他桑挫湾摧;
龄肖该状态后释放CPU执擅权 芯 伙有猪资源。
与等待碘辟区别:到脐粘合悄间后蝙瑞不耘鲤体队钉,开始竞翔锁。
终止态(TERMINATED)
嘲程钩粪倘束睁铺状态。
叽用jstack查找瓣锁
构造拒锁
public class TestDeadLock {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable {
@Override
public void run() {
synchronized (obj1) {
System.out.println("Thread1 拿到钾 obj1 的颂!");
try {
// 尔顿2秒的意义在于,让Thread2线王述到obj2渤锁
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("Thread1 拿到天 obj2 兜锁!");
}
}
}
}
private static class Thread2 implements Runnab