java线程堆栈问题定位第三讲

一、如何通过线程堆栈进行问题定位?
当获取线程堆栈后,可以通过线程堆栈得到什么内容?
a.线程调用层次关系,也就说,当前线程执行了什么 操作,调用了什么函数
b.线程的状态,及本身占有哪些锁,以及等待了哪些锁
c.可以看到锁的争用情况
d.从多次的打印线程堆栈后,可以了解一个线程是否长期在执行,且执行的内容一样
e.从多次的打印线程堆栈后,可以了解某个线程是否长期得不到锁的情况

二、通过线程堆栈,可以定位什么问题?
死锁
由于代码设计不合理,导致CPU过高
死循环
资源不足分析
性能瓶颈分析

三、针对资源不足的问题定位方法
资源不足一般是指数据库连接数,或者应用服务器的处理请求的线程数设置过少,导致的一种资源争用现象,请求该资源的线程会被阻塞或者被挂起,这种情况一般表现在随着压力的上升,服务器的吞吐量不升反降,处理请求的时间变长,TPS下降,一般情况下:反应在系统层面上为系统越来越慢,最后停止响应。这种情况下的线程堆栈表现方式如下:
a.许多线程停留在同样的调用上下文上,
http-8080-109” - Thread t@158” daemon prio=10 tid=0x0887c000 nid=0x5663 in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(Unknown Source)
- locked <1e43500f>> (a org.apache.commons.dbcp.AbandonedObjectPool)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject()
- locked <0x75132118> (a org.apache.commons.dbcp.AbandonedObjectPool)
at org.apache.commons.dbcp.PoolingDataSource.getConnection()
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:312)
at dbAccess.FailSafeConnectionPool.getConnection(FailSafeConnectionPool.java:162)
at servlets.ControllerServlet.doGet(ObisControllerServlet.java:93)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379

http-8080-110” - Thread t@159” daemon prio=10 tid=0x0887c020 nid=0x5673 in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(Unknown Source)
- locked <1e43500f>> (a org.apache.commons.dbcp.AbandonedObjectPool)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject()
- locked <1e43500f> (a org.apache.commons.dbcp.AbandonedObjectPool)
at org.apache.commons.dbcp.PoolingDataSource.getConnection()
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379

上述快照经多次打印后,其部分线程都停留在同样的执行动作上。

导致上面原因,结合线程堆栈,可以判断
资源数量配置较少,资源不中,导致某些线程不能及时获取 资源而等待在那里(挂起)
获取资源的线程占用时间太久,导致资源不足。
代码设计不合理导致占用资源时间较长,比如一些SQL查询,查询响应时间很长,访问太慢等
资源用完后,没有及时 关闭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值