线程堆栈信息怎么看?

一条线程堆栈信息大概长成下面这个样子:

RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae  waiting for monitor entry [0x00007fd4f8684000]
   java.lang.Thread.State:  BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:201)
-  waiting to lock <0x00000000acf4d0c0> (a org.apache.log4j.Logger)
at org.apache.log4j.Category.forcedLog(Category.java:388)
at org.apache.log4j.Category.log(Category.java:853)
at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234)
at com.tuan.core.common.lang.cache.remote.SpyMemcachedClient.get(SpyMemcachedClient.java:110)

根据上面这个样例,我们来逐个字段看下:

1.prio=10,线程优先级,1~10,10的优先级最高,优先执行。

2.tid线程ID,Thread.getId()方法获取的就是这个ID;

3.nid,操作系统上的原生id。如在linux系统上可以通过ps p PID -L -o pcpu,pid,tid,time,tname,cmd来获得进程ID为PID的线程ID,对应字段TID;获取到这个10进制的TID后,通过printf "%x\n" TID可以转换为堆栈信息中的16进制的nid。

4.waiting for monitor entry说明了当前线程再做什么,英文字面意思理解就可以。样例中这个可以理解为在等待对象监视器,一般就是说被synchoniezed字段锁了对象,正在等待获取这个对象的监视器。其他还有如waiting on condition,等待获取资源;DeadLock,死锁;Object.wait,等待对象等。

5. java.lang.Thread.State:  BLOCKED 这个说的是当前的线程状态,其他需要关注的状态还有DeadLock,Runnable,Waiting 。如果遇到阻塞,先看阻塞的waiting to lock <0x00000000acf4d0c0>对象,根据对象的ID 0x00000000acf4d0c0找是被哪个线程锁住的,然后再具体分析锁住的线程的堆栈信息,占用锁的线程会有locke<0x00000000acf4d0c0>。

转载于:https://my.oschina.net/ironthrone/blog/1841541

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值