jstack详解 博客分类: JAVA进阶
程序员文章站
2024-03-12 10:34:26
...
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请求了,故而应用会彻底挂掉;
推荐阅读
-
JAVA基础----网络通信之UDP通信 博客分类: JAVA基础 java编程UDP
-
jdk-源码中的一些坑 博客分类: JAVA基础JAVA进阶JDK源码 jdkRunnableTask
-
Java类初始化顺序 博客分类: JAVA基础 java初始化顺序
-
jstack详解 博客分类: JAVA进阶
-
jstack详解 博客分类: JAVA进阶
-
cl.exe参数详解 博客分类: VC++
-
多线程:如何确定所有任务都执行完成了? 博客分类: Java EE
-
Java GUI绘制时钟 博客分类: Java JavaSEGUIJFrameJPanel时钟
-
java图形界面基础之画图(使用Graphics类从画图形到图片到gif) 博客分类: java图形界面基础java图形界面基础,事件机制 javaGraphicsJFramegif
-
多线程写同一个excel文件(导出) 博客分类: Java EE 多线程excel导出文件