推荐一个java线程堆栈分析神器

作为一个java程序员,日常搬砖过程中是不是经常会遇到死锁的场景,但是一遇到死锁基本上少不了要去看线程的状态。在发生死锁时可以用jstack -l pid来观察锁持有情况。这样的会打印出各个线程堆栈的信息。不过这样查看起来不是很方便。 我们可以导出Thread dump文件然后通过图形化界面来进行分析。

  • 首先我们执行jps 命令可以找到我们程序对应的pid。
  • 然后通过 jstack pid >> 1.txt 导出线程堆栈
  • 然后在通过一个图形化工具IBM Thread and Monitor Dump Analyzer for Java 点击下载打开我们刚才导出的线程堆栈信息
    在这里插入图片描述
    在这里插入图片描述2.1 线程状态
  • New: 当线程对象创建时存在的状态,此时线程不可能执行;
  • Runnable:当调用thread.start()后,线程变成为Runnable状态。只要得到CPU,就执行;
  • Running:线程正在执行;
  • Waiting:执行thread.join()或在锁对象调用obj.wait()等情况就会进该状态,表明线程正处于等待某个资源或条件发生来唤醒自己;
  • Timed_Waiting:执行Thread.sleep(long)、thread.join(long)或obj.wait(long)等就会进该状态,与Waiting的区别在于Timed_Waiting的等待有时间限制;
  • Blocked:如果进入同步方法或同步代码块,没有获取到锁,则会进入该状态;
  • Dead:线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束
    其次,对于jstack日志,我们要着重关注如下关键信息
  • Deadlock:表示有死锁
  • Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
    Blocked:阻塞
  • Waiting on monitor entry:在等待获取锁in Object.wait():获取锁后又执行obj.wait()放弃锁
    一般重点查看“等待资源Waiting on condition”、“wait()”、“阻塞Blocked”。这些是引起CPU高,可能是线程执行有死循环
    这个工具还是挺好用的,强烈推荐下。下载地址:https://wwe.lanzouy.com/iUl1Myksjyf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值