为什么要使用线程Dump文件来进行诊断呢?一般都是诊断什么问题呢?
1、因为光靠加在应用中的日志往往只能够监控到业务逻辑的运行情况,然而java中的所有应用实际上都是运行在jvm中的,所以应用运行时出现的各种问题有时候需要到底层jvm中去才能找到出错的根源。例如,开发后期需要做性能调优的时候,往往也需要了解当前程序正在运行的线程的状态,正在执行的操作,从而分析系统可能存在的问题。
2、 一般是诊断线程阻塞,CPU使用率过高,JVM Crash,堆内存不足,和类装载等问题。
如何生成?
linux中通常先通过执行“ps -ef | grep java”来获取java运行中的各个进程的pid。然后通过JDK 工具包中的 jstack <pid>来产生线程 DUMP。
使用top -H -p PID来查看对应进程是哪个线程占用CPU过高。
jstack pid > report.txt 导出jstack信息到当前目录。
若是在代码的调试阶段,建议一般dump三次以便确定问题。若是线上环境出现线程挂起情况,则应在第一时间dump信息以便分析异常原因。
线程状态分析
1、Runnable
2、Waiting on condition
3、Waiting for monitor entry 和 in Object.wait()
4、lock
总结
在我们开发过程中,应当结合操作系统的各种工具观察系统资源使用状况,以及收集 Java线程的 DUMP信息,看线程都阻塞在什么方法上,了解原因,才能找到对应的解决方法。从而达到改进程序,提高性能的目的。