主流工具概览
- 这些命令行工具是做什么的?
- 每个工具解决了什么问题?
- 每个工具的参数集合分哪几类?
基于实战进行问题定位
- 进程监控:首先,找到生产环境中待定位的Java进程。
- 配置查询:进一步,查看此Java进程的JVM配置。
- JVM状态监控与初步分析:再进一步,查看此Java进程的内存、线程、JIT的整体情况。
- 内存监控与分析:如果STEP3发现了可能的内存问题,就深入分析内存。
- 线程监控与分析:如果STEP3发现了可能的线程问题,就深入分析线程。
进程监控:jps
- jps的参数格式如下:
jps [options] [hostid]
- 常见使用方法
-
jps
-
jps -q 输出main method的参数
-
jps -l 输出完全的包名,应用主类名,jar的全路径名称
-
jps -v 输出jvm参数
-
jps -m 输出传递给main方法的参数
-
- 更多详细使用方法,参考命令行手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jps.html#CHDCGECD
配置查询:jinfo
- jinfo的参数格式如下:
jinfo [options] pid
- 常见使用方法
- jinfo [pid] 查看此jvm进程所有配置
- jinfo -sysprops [pid] 等价于查看System.getProperties()
- jinfo -flags [pid] 查看所有参数
- jinfo -flag [参数名] [pid] 查看某个参数的值
- jinfo -flag name=value 不需要重启Java虚拟机,修改指定名称的参数为指定的值
- jinfo [+|-]name 启用或禁用指定名称的参数,该参数必须为Boolean类型
- 更多详细使用方法,参考命令行手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jinfo.html#BCGEBFDD
JVM状态监控与初步分析:jstat
- jstat的参数格式如下:
jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]
- 常见使用方法
- jstat -class -t -h3 [pid] 1000 5 采集类加载信息(每1000ms采集1次,采集5次,每3行打印1次表头)
- jstat -compiler -t -h3 [pid] 1000 5 采集JIT信息
- jstat -printcompilation -t -h3 [pid] 1000 5 采集已经被JIT编译过的方法
- jstat -gc -t -h3 [pid] 1000 5 采集垃圾回收堆统计信息
- jstat -gccapacity -t -h3 [pid] 1000 5 采集内存池生成和空间容量信息
- jstat -gcutil -t -h3 [pid] 1000 5 采集垃圾收集统计汇总信息
- 更多详细使用方法,参考命令行手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html#BEHHGFAE
内存监控与分析:jmap
- jmap的参数格式如下:
jmap [options] pid
- 常见使用方法
- jmap -heap [pid] 打印堆得汇总信息
- 更多详细使用方法,参考命令行手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jmap.html#CEGCECJB
线程监控与分析:jstack
- jstack的参数格式如下:
jstack pid
- 常见使用方法
- jstack [pid] 打印当前进程的线程快照信息
- 更多详细使用方法,参考命令行手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstack.html#BABGJDIF
补充内容
- Java语言定义了6种线程状态
- NEW:创建后尚未启动的线程处于这种状态,不会出现在Dump中
- RUNNABLE:包括Running和Ready。线程开启start()方法,会进入该状态,在虚拟机内执行的
- WAITING:无限的等待另一个线程的特定操作
- TIMED WAITING:有时限的等待另一个线程的特定操作
- BLOCKED:在程序等待进入同步区域的时候,线程将进入这种状态,在等待监视器锁
- TERMINATED:已终止线程的线程状态,线程已经结束执行
- Dump文件的线程状态一般以下4种
- RUNNABLE:线程处于执行中
- BLOCKED:线程被阻塞
- WAITING:线程正在等待
- TIMED_WAITING:线程正在等待
- Dump文件重点关键词
- runnable:线程处于执行中
- deadlock:死锁(重点关注)
- blocked:线程被阻塞 (重点关注)
- parked:停止
- locked:对象加锁
- waiting:线程正在等待
- waiting to lock:等待上锁
- Object.wait():对象等待中
- waiting for monitor entry:等待获取监视器(重点关注)
- Waiting on condition:等待资源(重点关注),最常见的情况是线程在等待网络的读写
实战使用
-
jstack排查死锁
- jps
- jstack
-
jstack排查CPU过高
- top
- top -Hp pid
- jstack pid
- jstack -l [PID] >/tmp/log.txt
-
GC频繁