Java运行状态分析2:获取线程堆栈信息
基本概念
出现内存泄漏或者运行缓慢场景,有时候无法直接从业务日志看出问题时候,需要分析jvm内存和线程堆栈
线程堆栈信息主要记录jvm线程在某时刻线程执行情况,分析线程状态可以跟踪到程序出问题的地方
内存堆栈信息主要记录jvm堆中在某时刻对象使用情况,主要用于跟踪是哪个对象占用了太多的空间,从而跟踪导致内存泄漏的地方
跟踪线程信息
查看当前线程数量
actuator
1.x
http://host:port/metrics/threads //当前进程的线程数
http://host:port/metrics/threads.daemon //当前进程后台驻留线程数
http://host:port/metrics/threads.peak //当前进程线程数峰值
2.x
http://host:port/actuator/metrics/jvm.threads.daemon //当前进程后台驻留线程数
http://host:port/actuator/metrics/jvm.threads.live //当前进程的线程数
http://host:port/actuator/metrics/jvm.threads.peak //当前进程线程数峰值
sop hystrix 线程状态
http://host:port/sys/hystrix/threads
linux
ps huH p {pid}|wc -l
jstack生成线程堆栈
当服务cup飙升或者出问题需要从主机层面定位时候,使用top -c 命令查看对应哪个进程占用了过高资源
找到资源占用高的进程
明确需要定位的进程通过如下命令找到对应的进程id
ps aux|grep {application alias}
接下来通过jstack导出对应的线程堆栈
jstack 对应参数如下
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
可以通过如下命令定位具体高load线程:
查询进程具体哪个线程占用高load
top -Hp {进程pid}
thread id为十六进制格式转十六进制值
printf %x {线程pid}
指定特定行数堆栈信息
jstack {进程id}|grep -A 200 {线程id}
服务器线程相对较多,文件大小较大,一般不会考虑在服务器看,另外这样查也会导致忽略了一些统计信息
通过如下命令导出文件,下载到本地查
jstack -l {pid} >> {dump-file-path}
如何查看分析dump文件,请看下文