欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jstack详解 博客分类: JAVA进阶

程序员文章站 2024-03-12 10:30:08
...

jstack

http://www.open-open.com/lib/view/open1456744049953.html
http://wenku.baidu.com/link?url=XGRAXwZGpPIyvYzcs0fqOGazbnKWWy6tsuDk5XhPUmVI4Y9jOT5TiYf6JVq0sPGafvMJmZFs1dNDlNtovldedF5xwr9ViMvv6WdRSaTGkn_

    (案例:转)公司的一个web应用项目运行了很长一段时间,达半年之久,前段时间突然出现了服务不可用的情况,所有的请求都不可达,服务彻底挂了。查看tomcat进程还在,cpu使用率低,一时没找着问题,重启了服务。过了两天,又出现了这种情况, 开始排查最近更新上线的代码,但是也没有发现可疑之处。
   
     开始怀疑JVM内存不够用了,通过jmap/jstat查看后,也没有发现存在JVM内存不够用,或者GC太频繁或者是FGC耗时太久的情况。
   
     接着下来用jstack -F pid 把所有的线程信息dump下来,发现了很多“Thread 2341: IN_NATIVE”的线程,而且都来自同一个类;定位到该类,里面用了socket去跟第三方接口做交互,而socket没有设置SoTimeout时间,这样的话,socket将永久地等待,直到inputStream有数据; socket.setSoTimeout(3000)之后,报出了很多Read  timed out 的异常信息,很明显就是第三方接口出问题了。
    
    所以出现故障的原因就是:一个http请求过来,tomcat接收到请求,分配一个worker Thread处理它,处理该请求的代码用到了前面提到的类,该worker Thread将永久处于socket.read()方法的wait状态或者说是IN_NATIVE状态;当时间一长,所有的worker thread都被占用,都处于socket.read()方法的wait状态后,tomcat没有worker thread处理任何的http请求了,故而应用会彻底挂掉;