java线程阻塞问题排查方法

本文记录了一次解决Java应用中线程阻塞问题的过程,通过使用jstack命令获取线程堆栈,分析dump文件找到blocked线程,并揭示了由于SQL死锁导致的线程阻塞。此外,还分享了如何不依赖特定工具,通过搜索线程名来定位阻塞源头,提供了一种手动排查死锁问题的方法。
摘要由CSDN通过智能技术生成
               

    我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。

    首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之后,搜索自己的worker名字。

"DefaultQuartzScheduler_Worker-10" prio=10 tid=0x00007f55cd54d800 nid=0x3e2e waiting for monitor entry [0x00007f51ab8f7000]   java.lang.Thread.State: BLOCKED (on object monitor) at com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl.addAccounts(NewPopAccountSyncServiceImpl.java:86) - waiting to lock <0x0000000782359268> (a com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl) at com.jd.chat.worker.service.timer.AccountIncSyncTimer.run(AccountIncSyncTimer.java:114) at com.jd.chat.worker.service.timer.AbstractTimer.start(AbstractTimer.java:44) at com.jd.chat.worker.service.timer.AbstractTimer.doJob(AbstractTimer.java:49) at com.jd.chat.worker.web.context.StartAppListener$TimerJob.execute(StartAppListener.java:188) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) - locked <0x0000000783641c68> (a java.lang.Object)



    很快便找到了线程在哪一行被阻塞。但是就凭这么点信息,并不能查出问题的真正原因,这里推荐一个工具,叫tda.
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值