当前位置: 首页 > Java > 正文

某java应用一直没响应解决方法

关键字:
1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

解决过程:
1、jstack多次后分析,很多的线程都在Blocked状态,等待一把锁,而持有这把锁的线程一直停在了Log4j的ConsoleLog的write上;

2、于是问题就集中到为什么ConsoleLog write的时候竟然会停住,最早猜测的原因是console是不是也输出到了一个文件,而这个文件出问题了,但经过检查发现一切正常;

3、通过ps auxf查看脚本看看console有没有输出到文件,发现这个脚本嵌套了好几层,但都输出到了外部的文件,而外部这个文件是没什么问题的;

4、仔细查看发现这个Java进程是在代码里通过调用脚本启动的,猜想是不是没有正确处理标准输出流和错误流造成的,于是翻看代码,发现代码只处理了输出流,但没处理错误流,并且在处理输出流时只处理了10000行,超过10000的时候就没再去读了,对于这种未将console重定向到外部文件的场景,linux会将其写到一个缓冲区,缓冲区写满后就会导致应用程序阻塞住,这个在Java的API上也有说明:

The parent process uses these streams(Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()) to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

5、到这步后就可以确认问题的原因了。

解决方法:
1、把输出到Console的Logger方式去掉了,这样自然就没问题了;

2、程序上修改,不是读到1w行就不读了,而是一直读到没有输出流和错误流了才结束,通常来说比较正确的做法请见这篇贴:http://goo.gl/sllmv

总结:
在Java中启动外部程序时一定要注意正确处理输出流和错误流。

本文固定链接: http://www.chepoo.com/application-no-response-solution.html | IT技术精华网

某java应用一直没响应解决方法:等您坐沙发呢!

发表评论