JAVA多线程死锁怎么找_Java多线程死锁问题

刚才用jstack解决了一个进程死锁的问题。

流程大致如下:

(0)环境要求,JDK1.6及以上

(1)先找到进程的PID,Windows下,打开进程管理器,按照名字排序,可以找到叫做javaw.exe的进程(java虚拟机进程一律叫做javaw.exe),要找出哪个是你的进程,记住当前进程列表,然后重启你的进程,PID刷新过的那个即是你的进程。

(2)在CMD下运行:jstack pid,jstack会在console上打出一系列信息

(3)分析上述信息

"startQuertz_Worker-2" prio=6 tid=0x000000006201f000 nid=0x14b0 runnable [0x0000000068b9e000]

java.lang.Thread.State: RUNNABLE

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

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

at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:97)

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

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

- locked <0x0000005896b7a708> (a java.io.BufferedInputStream)

at com.sun.mail.iap.ResponseInputStream.read0(ResponseInputStream.java:81)

at com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:67)

at com.sun.mail.iap.Response.(Response.java:83)

at com.sun.mail.imap.protocol.IMAPResponse.(IMAPResponse.java:48)

at com.sun.mail.imap.protocol.IMAPResponse.readResponse(IMAPResponse.java:122)

at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:230)

at com.sun.mail.iap.Protocol.command(Protocol.java:263)

- locked <0x0000005896b74cb8> (a com.sun.mail.imap.protocol.IMAPProtocol)

at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1234)

at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1226)

at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1028)

at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1023)

at com.sun.mail.imap.IMAPInputStream.fill(IMAPInputStream.java:101)

- locked <0x0000005896bb77d0> (a java.lang.Object)

at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:158)

- locked <0x0000005897da6540> (a com.sun.mail.imap.IMAPInputStream)

at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:184)

at com.sun.mail.util.BASE64DecoderStream.getByte(BASE64DecoderStream.java:337)

at com.sun.mail.util.BASE64DecoderStream.decode(BASE64DecoderStream.java:230)

at com.sun.mail.util.BASE64DecoderStream.read(BASE64DecoderStream.java:135)

at java.io.FilterInputStream.read(FilterInputStream.java:90)

at javax.mail.internet.MimeBodyPart.saveFile(MimeBodyPart.java:805)

at com.detao.dtma.email.EmailReciver.processAttachment(EmailReciver.java:244)

at com.detao.dtma.email.EmailReciver.processMsg(EmailReciver.java:140)

at com.detao.dtma.email.EmailReciver.processMsg(EmailReciver.java:93)

at com.detao.dtma.email.EmailReciver.processMessages(EmailReciver.java:69)

at com.detao.dtma.email.EmailReciver.processMessages(EmailReciver.java:50)

at com.detao.dtma.email.EmailReciverMgr.run(EmailReciverMgr.java:31)

at sun.reflect.GeneratedMethodAccessor2511.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273)

at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:264)

at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)

at org.quartz.core.JobRunShell.run(JobRunShell.java:203)

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)

"startQuertz_Worker-1" prio=6 tid=0x0000000064022800 nid=0x3a4 waiting for monitor entry [0x0000000068a9f000]

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

at java.lang.Object.wait(Native Method)

- waiting on <0x0000005872f40648> (a java.lang.Object)

at org.quartz.simpl.SimpleThreadPool.getNextRunnable(SimpleThreadPool.java:428)

- locked <0x0000005872f40648> (a java.lang.Object)

at org.quartz.simpl.SimpleThreadPool.access$000(SimpleThreadPool.java:47)

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:518)

"startQuertz_Worker-0" prio=6 tid=0x0000000060f15000 nid=0x13e8 waiting for monitor entry [0x000000006899f000]

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

at java.lang.Object.wait(Native Method)

- waiting on <0x0000005872f40648> (a java.lang.Object)

at org.quartz.simpl.SimpleThreadPool.getNextRunnable(SimpleThreadPool.java:428)

- locked <0x0000005872f40648> (a java.lang.Object)

at org.quartz.simpl.SimpleThreadPool.access$000(SimpleThreadPool.java:47)

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:518)

"Store userCache Spool Thread" daemon prio=6 tid=0x000000006194f000 nid=0x1354 waiting on condition [0x000000006889f000]

java.lang.Thread.State: TIMED_WAITING (sleeping)

at java.lang.Thread.sleep(Native Method)

at net.sf.ehcache.store.DiskStore.spoolAndExpiryThreadMain(DiskStore.java:634)

at net.sf.ehcache.store.DiskStore.access$900(DiskStore.java:68)

at net.sf.ehcache.store.DiskStore$SpoolAndExpiryThread.run(DiskStore.java:1110)

最后定位到错误行

at com.detao.dtma.email.EmailReciverMgr.run(EmailReciverMgr.java:31)

找到相应代码

public class EmailReciverMgr extends TimerTask {

/* 邮件接收器 一个邮件接收器对应一个邮箱 */

private java.util.List recivers;

/* 程序是否正在进行 */

private boolean running = false;

public void setRecivers(java.util.List recivers) {

this.recivers = recivers;

}

@Override

public void run() {

// 如果正在运行就返回,否则运行

if (running) {

return;

}

try {

running = true;

// 循环邮件接收器

for (EmailReciver reciver : recivers) {

// 处理邮件

reciver.processMessages();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

// 运行完毕设置为false,以便进行下一次运行

running = false;

}

}

}

程序本身没有问题,问题出现在了调用上,两个定时器都有自己的定时策略,分别调用了两次,造成相互等待,形成死锁。

此问题的难点在于问题的定位,问题的发生具有不确定性,有时候半月不发生,有时候一天发生多次,定位不到问题,后台没有任何报错,最后jstack,终于定位到了问题,找到问题之后,解决就好办了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值