JVM 监控工具

JVM 监控工具

官方手册:https://docs.oracle.com/javase/8/docs/technotes/tools/index.html

一、命令行监控工具

1. jps(JVM Process Status Tool)

功能: 列出正在运行的虚拟机并显示虚拟机执行主类名称

主要参数:

-q: 只显示进程ID
-m: 显示传递给main方法的参数
-l: 显示应用程序mian方法名称或jar文件的路径名
-v: 显示传递给JVM虚拟机的参数

实例:

  1. 列出正在运行的jvm进程id
$ jps
16420 Bootstrap
32375 Jps
  1. 显示传递给JVM虚拟机的参数
$ jps  -v
16420 Bootstrap -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
32333 Jps -Denv.class.path=.:/home/ubuntu/software/jdk/jdk1.8.0_151/lib:/home/ubuntu/software/jdk/jdk1.8.0_151/jre/lib -Dapplication.home=/home/ubuntu/software/jdk/jdk1.8.0_151 -Xms8m

2. jstat(JVM Statistics Monitoring Tool)

功能: 监视虚拟机各种运行状态信息,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据

命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

选项 作用
-class 监视类装载、卸载数量、总空间以及类装载所消耗的时间
-compiler 输出JIT编译器编译过的方法和、耗时
-gc 监视Java堆状况
-gccapacity 监视内容与-gc基本相同,主要关注java堆各个区域使用到的最大、最小空间
-gccause 与-gcutil功能相同,灰额外输出导致上一次GC产生的原因
-gcmetacapacity 监视元空间
-gcnew 监视新生代GC情况
-gcnewcapacity 监视内容与-gcnew相同,输出主要关注使用到的最大、最小空间
-gcold 监视老年代GC情况
-gcoldcapacity 监视内容与-gcold相同,输出主要关注使用到的最大、最小空间
-gcutil 监视内容与-gc基本相同,主要关注已使用空间占总空间的百分比
-printcompilation 输出已经被JIT编译的方法
  1. -class
$ jstat -class 16420
# 加载的类数 大小(Kb) 卸载的类数   大小(Kb) 执行类加载和卸载操作花费的时间
Loaded     Bytes     Unloaded  Bytes     Time
 15096   30199.4        3       4.6      15.34
  1. -gc
$ jstat -gc 16420
# 单位是KB
# survivor0容量 survivor1容量 survivor0使用 survivor1使用  Eden容量  Eden使用   OLD容量     OLD使用    元空间容量 元空间使用 压缩类空间容量 压缩类空间使用  年轻代GC数量 年轻代GC时间  Full GC数量  Full GC时间 GC总时间
    S0C          S1C            S0U          S1U            EC       EU        OC         OU       MC        MU         CCSC      CCSU         YGC          YGCT         FGC       FGCT        GCT
  29696.0     28160.0         560.5          0.0        1339904.0 124539.0 2796544.0   144642.9  99072.0   89527.5   12544.0     10189.7        42         0.550          5       0.566       1.116
  1. -gccapacity
$ jstat -gccapacity  16420
# 最小新生代容量 最大新生代容量 当前新生代容量 survivor0容量 survivor1容量  Eden容量  最小老年代容量 最大老年代容量  当前老年代容量 老年代空间容量  最小元空间容量 最大元空间容量  元空间大小 最小压缩类空间容量 最大压缩类空间容量 压缩类空间容量 年轻代GC数量 FUll GC数量
 NGCMN          NGCMX         NGC         S0C          S1C           EC          OGCMN        OGCMX       OGC           OC         MCMN        MCMX          MC        CCSMN          CCSMX          CCSC           YGC           FGC
1397760.0     1397760.0    1397760.0    29696.0      28160.0     1339904.0      2796544.0  2796544.0   2796544.0     2796544.0      0.0      1136640.0     99072.0      0.0         1048576.0       12544.0          42            5

关于OGC和GC的区别:https://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc
OGC = sum(all OC),但是HotShot中old space只有一个

  1. -gcutil
$ jstat -gcutil  16420
# Survivor0使用比 Survivor0使用比 Eden使用比 OLD使用比  元空间使用比  压缩类使用比 年轻代GC数量  
       S0              S1           E      O           M         CCS       YGC         YGCT    FGC    FGCT     GCT
      1.89           0.00         16.46   5.17       90.37      81.23       42         0.550     5    0.566    1.116
  1. -gccause
# jstat -gccause  16420
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
  1.89   0.00  17.20   5.17  90.37  81.23     42    0.550     5    0.566    1.116 Allocation Failure   No GC
  1. 持续监控

隔2秒监控一次堆使用情况,监测5次

$ jstat -gcutil  16420 2000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116
  1.89   0.00  18.61   5.17  90.37  81.23     42    0.550     5    0.566    1.116

二、图形化监控工具

1. jconsole

3. jvisualvm

三、调试工具

1. jinfo

功能:实施查看和调整虚拟机参数

命令格式

jinfo [option] <pid>
参数:
    -flag <name>         打印虚拟机参数的值
    -flag [+|-]<name>    启用或关闭虚拟机参数
    -flag <name>=<value> 设置虚拟机参数
    -flags               打印虚拟机参数
  1. 查看指定参数的值
$ jinfo -flag  InitialHeapSize   16420
-XX:InitialHeapSize=4294967296
  1. 查看虚拟机参数
jinfo -flags 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:  -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp

2. jmap

功能: 生成堆转储快照,查询finalize执行队列、Java堆详细信息、当前使用的那种收集器

主要选择

选择 作用
-heap 显示java堆信息,如使用哪种回收器、参数配置、分代情况
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-dump 生成java堆转储快照
-clstats 打印Java堆的类加载器的统计信息。对于每个类加载器,它的名称,它的活动程度,地址,父类加载器以及它加载的类的数量和大小都会被打印出来。
-finalizerinfo 打印有关正在等待最终确定的对象的信息
-F 当虚拟机进程没有响应时强制生成dump快照
  1. 打印java堆信息
# 须以root用户执行
$ jmap -J-d64 -heap 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12

using thread-local object allocation.
Parallel GC with 8 thread(s)    # 垃圾收集器

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 1431306240 (1365.0MB)
   MaxNewSize               = 1431306240 (1365.0MB)
   OldSize                  = 2863661056 (2731.0MB)
   NewRatio                 = 2                         # 老年代占据堆的2/3,新生代占据1/3
   SurvivorRatio            = 8                         # Survivor:Eden=1:8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:     # Eden区内存分布
   capacity = 1378353152 (1314.5MB)
   used     = 74006280 (70.57788848876953MB)
   free     = 1304346872 (1243.9221115112305MB)
   5.36918132284287% used
From Space:      # 其中一个Survivor区的内存分布           
   capacity = 27262976 (26.0MB)
   used     = 0 (0.0MB)
   free     = 27262976 (26.0MB)
   0.0% used
To Space:        # 另一个Survivor区的内存分布
   capacity = 25690112 (24.5MB)
   used     = 0 (0.0MB)
   free     = 25690112 (24.5MB)
   0.0% used
PS Old Generation
   capacity = 2863661056 (2731.0MB)
   used     = 60243072 (57.4522705078125MB)
   free     = 2803417984 (2673.5477294921875MB)
   2.1037081841015195% used

38423 interned Strings occupying 4154104 bytes.
  1. 显示堆中对象统计信息
# 须以jvm启动用户执行该命令
$ jmap -histo:live 16420
 num     #instances         #bytes  class name
----------------------------------------------
   1:        187022       22144672  [C
   2:        185124        4442976  java.lang.String
   3:         85170        2725440  java.util.HashMap$Node
   4:         29978        2638064  java.lang.reflect.Method
   5:         40422        2440632  [Ljava.lang.Object;
   6:          6915        2123840  [B
   7:         15533        1718560  java.lang.Class
   ...         ...           ....   ...
6186:             1             16  sun.util.resources.LocaleData
6187:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
6188:             1             16  websocket.drawboard.DrawboardContextListener
Total       1186181       62814680
  1. 转储堆快照
$ jmap -dump:live,format=b,file=jenkins.bin 16420
Dumping heap to /home/jenkins/jenkins.bin ...
$ ll jenkins.bin  -h
-rw------- 1 jenkins jenkins 1011M 2月  14 11:43 jenkins.bin

3. jhat

功能:分析jamp生成的堆转储快照,jhat内置了一个微型HTTP服务器,生成dump文件的分析结果后可以在浏览器查看。

一般不会在生产服务器上进行分析,非常耗CPU和内存,不常用

jhat jenkins.bin 
Reading from jenkins.bin...
Dump file created Thu Feb 14 11:43:45 CST 2019
Snapshot read, resolving...
Resolving 12022774 objects...
Chasing references, expect 2404 
dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

使用浏览器访问http://ip:7000 查看分析结果

4.jstack

功能: 生成虚拟机当前时刻的线程快照(一般称为threaddump、javacore文件)

参数:
-l: 打印关于锁的信息
-m: 打印java和native frames 的信息

  1. 使用方法
$ jstack -l 16420  > jenkins.jstack

线程的几种状态:

状态 含义
NEW 未启动的,不会出现在dump中
RUNNABLE 在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表面它获得了某把锁
BLOCKED 受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
WATING 无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
TIMED_WATING 有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
TERMINATED 已退出的。
posted @ 2019-02-16 17:49  苏方木  阅读(311)  评论(0编辑  收藏  举报