AnthonyZero's Bolg

JVM-性能监控命令

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
3
jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数

jinfo:查看虚拟机参数

显示虚拟机的配置信息,可观察进程运行环境参数,包括Java System属性和JVM命令行参数。
jinfo [option] [pid]
示例:

1
2
jinfo -flags <PID>   //打印传给JVM的命令参数值
jinfo -sysprops <PID> //打印系统属性值

jstat:虚拟机统计信息

jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。
jstat -[option] [-t] [-h] [vmid] [interval] [count]

其中 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
2
jstack pid >pid.log    生成日志文件
jstack -l <pid> | grep 线程ID的16进制数 -A 10

线程快照分析平台