最近在做一个基于多线程的网络抓取,运行过程中总是假死,为此我给线程增加了超时安全退出,但是仍旧没有解决这个问题。后来想了一下,应该有相关的JVM问题定位工具,搜索了一下相关内容,发现jconsole可以考虑尝试一下。
1. jconsole 是什么?
从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。
2. jconsole 如何启动?
将java/bin设置到path路径下,在命令窗口>>jconsole 这样就可以启动了
3. jconsole中图形分析-线程
查看每个线程详细情况,两个指标:总阻止数 总等待数 这两个指标中总等待数如果过于大则表明有可能出问题,而我的应用里面发现这个值已经超过3w,继续查看堆栈跟踪,发现在调用某个方法的时候出现循环调用,记录下代码行数,去源代码中进行分析,发现递归嵌套会导致的死循环,修复此行代码,进行测试,发现线程总等待数趋于平衡,问题解决。
反思:
1.问题发生之前: 写代码的阶段一定要注意必须有测试方法做为支撑
2.问题发生之后:冷静的分析,找到合适的工具,学习图形指标的意义,仔细观察,大胆猜测。