深入理解Java虚拟机之JDK命令行工具(一)

2017/8/2 posted in  Java

JDK命令行工具,是java提供给我们的礼物,我们怎么能拒绝他们的馈赠呢

jps:虚拟机进程状况工具

jps(JVM Process Status)
可以列出正在运行的虚拟机进程,,并显示虚拟机执行主类(main函数的名称),以及这些进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)
对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的

jps命令格式

jps [options] [hostid]

jps工具主要选项

选项 作用
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类的全名,如果进程执行的是jar包,输出jar路径
-v 输出虚拟机进程启动时JVM参数

jps命令样例1

[hadoop@U006 ~]$ jps -l
3183 sun.tools.jps.Jps
17831 org.apache.spark.executor.CoarseGrainedExecutorBackend
10004 org.apache.spark.deploy.worker.Worker
17659 org.apache.spark.deploy.SparkSubmit
10254 org.apache.spark.deploy.worker.Worker
9830 org.apache.spark.deploy.master.Master

jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)
jstat是用于监视虚拟机各种运行状态信息的命令行工具
它可以显示本地或远程虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据.
在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具

jstat命令格式

jstat [option vmid [interval[s|ms] [count]]]

注意:

  • 对于命令中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的.
  • 如何是远程虚拟机进程,那VMID的格式应当是:[protocal:][//]lvmid[@hostname[:port]/servername]
  • 参数interval和count代表查询间隔和次数.如果省略这两个参数,说明只查询一次.

假设需要每250毫秒查询一次进程2764垃圾收集的状况,一共查询20次,那么命令应该是:

jstat -gc 2764 250 20

每2毫秒查询10次spark进程的垃圾收集状况:

[hadoop@U006 ~]$ jstat -gc 17659 2 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056
349184.0 349184.0  0.0    0.0   2098176.0 954275.3 5592576.0   246723.4  116224.0 115802.6     52    5.099  48     18.956   24.056

jstat工具主要选项

选项 作用
-class 监视类装载,卸载数据,总空间及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区,2个survivor区,老年代,永久代等的容量,已用空间,GC时间合计等信息
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
... ...

jstat执行样例

hadoop@U006 ~]$ jstat -gcutil 17659
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  37.59   4.41  99.68     77    7.439    73   27.473   34.912

查询结果表明:
这个进程的

  • 新生代Eden区(E,表示Eden)使用了37.59%的空间.
  • 两个Survivor区(S0,S1,表示Survivor0,Survivor1)里面都是空的.
  • 老年代(O,表示Old)和永久代(P,表示Permanent)则分别使用了4.41%和99.68%的空间.
  • 程序运行以来共发生Minor GC(YGC,表示Young GC)77次,总耗时7.439秒.
  • 发生Full GC(FGC,表示Full GC)73次,Full GC总耗时(FGCT,表示Full GC Time)为27.473秒.
  • 所有GC总耗时(GCT,表示GC Time)为34.912秒.

总结:使用jstat工具在纯文本状态下监视虚拟机状态的变化,虽然没有一些可视化监控工具来得直观.但与我而言,更显极客本色.

jinfo:Java配置信息工具

jinso(Configuration Info For Java)
jinfo的作用是实时地查看和调整虚拟机的各项参数

jinfo命令格式

jinfo [option] pid

使用方式

前面解释过jps的-v选项.这个可以查看虚拟机启动时显示指定的参数列表,比如

[hadoop@U006 ~]$ jps -v
17831 CoarseGrainedExecutorBackend -Xms4096M -Xmx4096M -Dspark.driver.port=42195 -XX:MaxPermSize=256m
5146 Jps -Dapplication.home=/usr/java/jdk1.7.0_71 -Xms8m
10004 Worker -Xms1g -Xmx1g -XX:MaxPermSize=256m
17659 SparkSubmit -Xms8g -Xmx8g -XX:MaxPermSize=256m
10254 Worker -Xms1g -Xmx1g -XX:MaxPermSize=256m
9830 Master -Xms1g -Xmx1g -XX:MaxPermSize=256m

但如果想知道未被显示指定的参数的系统默认值,除了查找资料,还可以使用这里的jinfo的-flag选项进行查询了.

比如查询CMSInitiatingOccupancyFraction参数值:

[hadoop@U006 ~]$ jinfo -flag CMSInitiatingOccupancyFraction 17659
-XX:CMSInitiatingOccupancyFraction=-1

jmap:Java内存映像工具

jmap(Memory Map For Java)
jmap是用于生成堆转储快照(一般称为Heapdump或dump文件).

jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)

线程快照: 就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是 定位线程出现长时间停顿的原因.

线程长时间停顿的常见原因:
1.线程间死锁,死循环
2.请求外部资源导致的长时间等待
3.等等

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源.

jstack命令格式

jstack [option] vmid

jstack工具的主要选项

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈