JDK命令行工具可以监控虚拟机性能,让程序员了解虚拟机运行状态,对出现的故障进行修复
一般当虚拟机出现问题我们查看其运行日志,异常堆栈,GC日志,线程快照(threaddump),堆转储快照(heapdump)等。在这时候中Java自带的一些状态监控命令和图形化工具就派上用场了。
jps:查看虚拟机进程
jps 命令可以列出所有的 Java 进程。如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称
jps [options] [hostid]
options参数解释:
- -l : 输出主类全名或jar路径
- -q : 只输出LVMID
- -m : 输出JVM启动时传递给main()的参数
- -v : 输出JVM启动时显示指定的JVM参数
示例:1
2
3jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数
jinfo:查看虚拟机参数
显示虚拟机的配置信息,可观察进程运行环境参数,包括Java System属性和JVM命令行参数。
jinfo [option] [pid]
示例:1
2jinfo -flags <PID> //打印传给JVM的命令参数值
jinfo -sysprops <PID> //打印系统属性值
jstat:虚拟机统计信息
jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。
jstat -[option] [-t] [-h
其中 option 可以由以下值构成。
参数 | 含义 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
-gc | 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息 |
-gccapacity | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-printcompilation | 输出已经被JIT编译的方法 |
示例: 11195为pid,每隔500毫秒打印一次,打印10次1
2
3
4
5
6
7
8
9
10
11[root@instance ~]# jstat -gcutil 11195 500 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
26.78 0.00 53.79 95.84 94.01 92.29 2232 16.318 4 0.928 17.247
字段解释:
- S0 survivor0使用百分比
- S1 survivor1使用百分比
- E Eden区使用百分比
- O 老年代使用百分比
- M 元数据区使用百分比
- CCS 压缩使用百分比
- YGC 年轻代垃圾回收次数
- YGCT 年轻代垃圾回收消耗时间
- FGC 老年代垃圾回收次数
- FGCT 老年代垃圾回收消耗时间
- GCT 垃圾回收消耗总时间
jmap:导出堆到文件
jmap是用来生成堆dump文件和查看堆相关的各类信息的命令,例如查看finalize执行队列,heap的详细信息和使用情况
jmap [option] vmid
示例:把java堆中的存活对象信息转储到dump.hprof文件(二进制形式)1
jmap -dump:live,format=b,file=dump.hprof 11666
配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
jhat:堆分析工具
jhat 命令用于分析 Java 应用的堆快照内存。Sun JDK 提供了 jhat 命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件的分析结果后,可以在浏览器中查看
命令格式:
jhat [option] [dumpfile]
示例:1
jhat dump.hprof
一般情况下不用 jhat 命令来分析 dump 文件:一个原因是分析工作是一个耗时而且消耗硬件资源的过程。另一个原因是 jhat 的分析功能还比较简陋。
jstack:查看线程堆栈
jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的文件中的stack信息。
jstack [option] vmid
option参数解释:
- -F 当使用jstack
无响应时,强制输出线程堆栈 - -m 同时输出java和本地堆栈(混合模式)
- -l 额外显示锁信息
示例:1
2jstack pid >pid.log 生成日志文件
jstack -l <pid> | grep 线程ID的16进制数 -A 10