JVM的线程状态及如何排查死锁原因

本文介绍了JVM中的线程状态,包括创建、就绪、运行、阻塞和死亡,并详细阐述了线程在TIMED_WAITING、WAITING、BLOCKED和RUNNABLE等状态的含义。通过分析线程堆栈,展示了如何识别和排查死锁问题,例如当线程因等待不同锁而形成等待环时,即可能出现死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:线程状态:

操作系统的线程状态一共有:创建,就绪,运行,阻塞,死亡。

创建:生成线程对象,并未调用start()方法

就绪:调用thread.start()方法之后,线程还未被线程调度程序置为当前执行线程之前。

      或者线程在wait()时被notify后,或者sleep(1000)完成后。

          或者调用了线程的yield()方法后

运行:线程被线程调度程序置为当前执行线程

阻塞:线程wait()中或者sleep()中,或者等待某个锁

死亡:线程run()方法执行完毕;

 

二:jvm线程堆栈中的线程状态一共有以下:

1、TIMED_WAITING:出现在线程调用了wait(long)或者join(long)或sleep(long)的情况下

在线程堆栈中有两种常见表示:TIMED_WAITING (on object monitor)和TIMED_WAITING (sleeping)

2、WAITING:线程获得一个对象锁后,在该对象上等待其他线程来notify()

在线程堆栈中常见表示:WAITING (on object monitor)

3、BLOCKED:线程在等待临界资源被释放,比如等待另外一个线程释放临界资源

在线程堆栈中常见表示:BLOCKED (on object monitor)

4、RUNNABLE:当获得CPU的使用权时就可运行的线程,所以一次线程堆栈中可以有多个处于RUNNABLE状态的线程。该状态下,线程处于等待的原因,io,cpu时间片,而非锁,sleep().

在线程堆栈中常见表示:

java.lang.Thread.State: RUNNABLE

at java.net.SocketInputStream.socketRead0(Native Method)

        at java.net.SocketInputStream.read(SocketInputStream.java:129)

        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)

        at java.io.BufferedInputStream.read(BufferedInputStream.java:237)

 

三:如何根据线程堆栈判断死锁:

根据死锁的原理,死锁原因可在BLOCKED状态的线程堆栈中找到原因。

如下例子:三个线程因等待不同的锁,处于BLOCKED状态,且A线程等待B线程持有的锁,B等待C持有的锁,而C又等待A持有的锁,造成锁的等待环,形成死锁。

 

1、线程"UCA_FINTERFACE ResponseListenerThread",已获得锁<0x2b0c5b78>和<0x2b0dc348>和<0x14990288>,等待获取锁<0x14990230>,处在挂起状态

 

2、    线程"UCA_MAINFRAMESERVICE startupMonitor com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor"

    已获得锁<0x14990230>等待去获取锁<0x2b0c5b08>,

 

3、线程“UCA-FM:init client model”已获得锁<0x2b0c5b08>和<0x2b0c5ce0>,<0x2b0c5cf0>,等待锁<0x2b0c5b78>

 

线程1堆栈:

"UCA_FINTERFACE ResponseListenerThread" prio=10 tid=0x06438c00 nid=0x335e0 waiting for monitor entry [0x0869f000]

   java.lang.Thread.State: BLOCKED (on object monitor)

  at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager.syncAlarmsFromLocalDB(LocalAlarmListenerManager.java:104)

        - waiting to lock <0x14990230> (a com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager)

        at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalSyncManager.syncAlarms(LocalSyncManager.java:86)

        at com.zte.ums.common.fm.wsf.dataprovider.AlarmDataProviderImpl.syncAlarmData(AlarmDataProviderImpl.java:213)

        - locked <0x2b0dc348> (a com.zte.ums.common.fm.wsf.dataprovider.AlarmDataProviderImpl)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator.syncAlarmData(AlarmListenerDecorator.java:144)

        - locked <0x2b0c5b78> (a com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator)

        at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.initListeners(AlarmQueryFromServerRespListener.java:146)

        at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.handleQueryResoponse(AlarmQueryFromServerRespListener.java:131)

        at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.onResponse(AlarmQueryFromServerRespListener.java:92)

        - locked <0x14990288> (a com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener)

        at com.zte.ums.uep.pfl.finterface.wsf.FServiceProxy$ResponseListenerProxy.onResponse(FServiceProxy.java:682)

        at com.zte.ums.uep.pfl.finterface.wsf.ResponseListenerThread.run(ResponseListenerThread.java:165)

                  

线程2堆栈:

         : "UCA_MAINFRAMESERVICE startupMonitor com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor" prio=10 tid=0x06677800 nid=0x2ec40 waiting for monitor entry [0x07d3f000]

   java.lang.Thread.State: BLOCKED (on object monitor)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.addAlarmListener(AlarmModel.java:93)

        - waiting to lock <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)

        at com.zte.ums.common.fm.wsf.misc.sound.notifyrule.AlarmNotifyRuleAudioContinusPlayer.init(AlarmNotifyRuleAudioContinusPlayer.java:78)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmNotifyRuleManager.init(AlarmNotifyRuleManager.java:117)

        at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager.start(LocalAlarmListenerManager.java:48)

        - locked <0x14990230> (a com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager)

        at com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor.initUponServerStarted(FmStartupMonitor.java:69)

        at com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor.startedup(FmStartupMonitor.java:43)

        at com.zte.ums.uep.pfl.mainframe.main.control.WorkFlow$8$1$1.run(WorkFlow.java:1226)

        at java.lang.Thread.run(Thread.java:661)

线程3堆栈

"UCA-FM:init client model" prio=10 tid=0x065ed400 nid=0x3265c waiting for monitor entry [0x0793f000]

   java.lang.Thread.State: BLOCKED (on object monitor)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator.stop(AlarmListenerDecorator.java:91)

        - waiting to lock <0x2b0c5b78> (a com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher.removeAllListener(AlarmEventDispatcher.java:169)

        - locked <0x2b0c5cf0> (a java.util.ArrayList)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher.stop(AlarmEventDispatcher.java:109)

        - locked <0x2b0c5ce0> (a com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.stop(AlarmModel.java:75)

        - locked <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)

        at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.syncAlarms(AlarmModel.java:170)

        - locked <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)

        at com.zte.ums.common.fm.wsf.msgservice.SyncAlarmManager.syncAlarms(SyncAlarmManager.java:112)

        at com.zte.ums.common.fm.wsf.misc.AlarmModelUpdateManager$1.run(AlarmModelUpdateManager.java:55)

        at java.lang.Thread.run(Thread.java:661)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值