0
点赞
收藏
分享

微信扫一扫

02.Monitor the Java Virtual Machine

ITWYY 2022-01-04 阅读 46
javajvm

jps

Java Virtual Machine Process Status,jdk提供的查看当前java进程的小工具,作用等同与ps

[root@m src]# jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]
  • 命令格式
jps [options] [hostid]
  • [options]

    • -q: 仅输出VM标识符(java进程号),不包括classname,jar name,arguments in main method
    [root@m src]# jps -q
    16259
    17788
    
    • -m: 输出main method的参数
    [root@m src]# jps -m
    17826 Jps -m
    16259 Bootstrap start
    
    • -l: 输出完全的包名,应用主类名,jar的完全路径名
    [root@m src]# jps -l
    17856 sun.tools.jps.Jps
    16259 org.apache.catalina.startup.Bootstrap
    
    • -v:输出jvm参数
    [root@m src]# jps -v
    16259 Bootstrap -Djava.util.logging.config.file=/usr/local/src/apache-tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/src/apache-tomcat-7.0.47/endorsed -Dcatalina.base=/usr/local/src/apache-tomcat-7.0.47 -Dcatalina.home=/usr/local/src/apache-tomcat-7.0.47 -Djava.io.tmpdir=/usr/local/src/apache-tomcat-7.0.47/temp
    17902 Jps -Denv.class.path=.:/usr/local/jdk1.8.0_151//lib/tools.jar:/usr/local/jdk1.8.0_151//lib/dt.jar -Dapplication.home=/usr/local/jdk1.8.0_151 -Xms8m
    
    • -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
    [root@m src]# jps -V
    16259 Bootstrap
    17956 Jps
    
  • [hostid]

    • hostid完整格式为[hostname]:[port]/[servername]
    • jps命令可以查看本机的jvm进程,同时也支持查看远程服务器的jvm进程(远程服务器需启动jstatd,详见jstatd命令)
    • hostid用于指定jps命令要查看jvm进程的服务器,如果查看本机,hostid为空;如果要查看远程服务器,hostid需要指定远程服务器的IP和端口(端口默认为1099)

jps连接远程服务器,默认端口

[root@m ~]# jps 192.168.127.133
10836 Jstatd
8035 ray-test-log-1.0-SNAPSHOT.jar

jps连接远程服务器,指定端口,需要先在本机/etc/hosts配置远程服务器的名称,然后通过名称+端口访问

[root@m ~]# jps -mlv w1:9999
5840 /usr/local/src/test/test1/ray-test-log-1.0-SNAPSHOT.jar
6010 ray-test-log-1.0-SNAPSHOT.jar
24942 sun.tools.jstatd.Jstatd -p 9999 -Dapplication.home=/usr/local/jdk1.8.0_191 -Xms8m -Djava.security.policy=/usr/local/jdk1.8.0_191/bin/jstatd.all.policy
  • jps命令无输出
    • 原因:jps命令需要在/tmp目录下的”hsperfdata_用户名“ 目录中存放进程ID,如果我们使用普通用户登录,就可能没有权限去创建这个文件夹。
    • 解决: 在/tmp目录中创建一个”hsperfdata_用户名“ 文件夹,并设置权限

jstat

Java Virtual Machine statistics monitoring tool, 利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。

[root@m ~]# jstat -help
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.
  • 命令格式
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
  • -t:输出的报告首列显示时间戳,单位秒

  • -h:每输出指定lines行数报告后,输出一次表头

  • vmid:完整格式为pid@hostid

    • jstat命令可以监控本机的jvm,同时也支持监控远程服务器的jvm(远程服务器需启动jstatd,详见jstatd命令)
    • hostid用于指定jstat命令要监控jvm的服务器,如果查看本机,hostid为空;如果要监控远程服务器,hostid需要指定远程服务器的IP和端口(端口默认为1099)
  • interval:按照指定的interval时间间隔输出报告,单位毫秒

  • count:按照指定的count输出报告次数

  • [option]

    [root@m ~]# jstat -options
    -class				#类加载统计
    -compiler			#编译统计
    -gc					#垃圾回收统计
    -gccapacity			#堆内存统计
    -gccause			#最近一次gc统计和原因
    -gcmetacapacity		#jdk8 元数据空间统计
    -gcnew				#新生代垃圾回收统计
    -gcnewcapacity		#新生代内存统计
    -gcold				#老年代垃圾回收统计
    -gcoldcapacity		#老年代内存统计
    -gcutil				#总垃圾回收统计
    -printcompilation	#jvm编译方式统计
    
    • -class:类加载统计
    [root@m ~]# jstat -class -t -h 5  8035@192.168.127.133 1000 3
    Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
            17870.0   6626 12137.8        0     0.0      10.35
            17871.0   6626 12137.8        0     0.0      10.35
            17872.0   6626 12137.8        0     0.0      10.35
    
    列名描述
    Loaded装载类的数量
    Bytes装载类占用的字节数
    Unloaded卸载类的数量
    Bytes卸载类占用的字节数
    Time装载和卸载类花费的时间
    • -compiler:编译统计
    [root@m ~]# jstat -compiler -t -h 5  8035@192.168.127.133 1000 3
    Timestamp       Compiled Failed Invalid   Time   FailedType FailedMethod
            18081.3     3277      1       0     7.71          1 java/net/URLClassLoader$1 run
            18082.4     3277      1       0     7.71          1 java/net/URLClassLoader$1 run
            18083.3     3277      1       0     7.71          1 java/net/URLClassLoader$1 run
    
    列名描述
    Compiled编译任务执行数量
    Failed编译任务执行失败数量
    Invalid编译任务执行失效数量
    Time编译任务消耗时间
    FailedType最后一个编译失败任务的类型
    FailedMethod最后一个编译失败任务所在的类及方法
    • -gc:垃圾回收统计
    [root@m ~]# jstat -gc -t -h 5  8035@192.168.127.133 1000 3
    Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
            18540.5 6656.0 6656.0  0.0   3776.0 142336.0 38583.6   28672.0    14935.4   35712.0 34084.8 4480.0 4179.7     11    0.751   2      0.120    0.871
            18541.5 6656.0 6656.0  0.0   3776.0 142336.0 38583.6   28672.0    14935.4   35712.0 34084.8 4480.0 4179.7     11    0.751   2      0.120    0.871
            18542.5 6656.0 6656.0  0.0   3776.0 142336.0 38583.6   28672.0    14935.4   35712.0 34084.8 4480.0 4179.7     11    0.751   2      0.120    0.871
    
    
    列名描述
    S0C年轻代中第一个survivor(幸存区)的容量 (字节)
    S1C年轻代中第二个survivor(幸存区)的容量 (字节)
    S0U年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
    S1U年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
    EC年轻代中Eden(伊甸园)的容量 (字节)
    EU年轻代中Eden(伊甸园)目前已使用空间 (字节)
    OCOld代的容量 (字节)
    OUOld代目前已使用空间 (字节)
    MC元空间的容量 (字节)
    MU元空间目前已使用空间 (字节)
    CCSC压缩类空间大小
    CCSU压缩类空间使用大小
    YGC年轻代垃圾回收次数
    YGCT年轻代垃圾回收消耗时间
    FGC老年代垃圾回收次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间
    • -gccapacity:堆内存统计
    [root@m ~]# jstat -gccapacity -t -h 5  8035@192.168.127.133 1000 3
    Timestamp        NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
            18978.6  10240.0 155648.0 155648.0 6656.0 6656.0 142336.0    20480.0   311296.0    28672.0    28672.0      0.0 1081344.0  35712.0      0.0 1048576.0   4480.0     11     2
            18979.6  10240.0 155648.0 155648.0 6656.0 6656.0 142336.0    20480.0   311296.0    28672.0    28672.0      0.0 1081344.0  35712.0      0.0 1048576.0   4480.0     11     2
            18980.6  10240.0 155648.0 155648.0 6656.0 6656.0 142336.0    20480.0   311296.0    28672.0    28672.0      0.0 1081344.0  35712.0      0.0 1048576.0   4480.0     11     2
    
    列名描述
    NGCMN新生代最小容量
    NGCMX新生代最大容量
    NGC当前新生代容量
    S0C第一个幸存区大小
    S1C第二个幸存区大小
    EC伊甸园区的大小
    OGCMN老年代最小容量
    OGCMX老年代最大容量
    OGC当前老年代大小
    OC当前老年代大小
    MCMN最小元数据容量
    MCMX最大元数据容量
    MC当前元数据空间大小
    CCSMN最小压缩类空间大小
    CCSMX最大压缩类空间大小
    CCSC当前压缩类空间大小
    YGC年轻代gc次数
    FGC老年代GC次数
    • -gccause:最后一次gc统计和原因
    [root@m ~]# jstat -gccause -t -h 5  8035@192.168.127.133 1000 3
    Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
            22131.0   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871 Allocation Failure   No GC
            22132.0   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871 Allocation Failure   No GC
            22133.0   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871 Allocation Failure   No GC
    
    • -gcmetacapacity:元数据空间统计
    [root@m ~]# jstat -gcmetacapacity -t -h 5  8035@192.168.127.133 1000 3
    Timestamp          MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
            22410.2        0.0  1081344.0    35712.0        0.0  1048576.0     4480.0    11     2    0.120    0.871
            22411.2        0.0  1081344.0    35712.0        0.0  1048576.0     4480.0    11     2    0.120    0.871
            22412.2        0.0  1081344.0    35712.0        0.0  1048576.0     4480.0    11     2    0.120    0.871
    
    列名描述
    MCMN最小元数据容量
    MCMX最大元数据容量
    MC当前元数据空间大小
    CCSMN最小压缩类空间大小
    CCSMX最大压缩类空间大小
    CCSC当前压缩类空间大小
    YGC年轻代gc次数
    FGC老年代GC次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间
    • -gcnew:新生代垃圾回收统计
    [root@m ~]# jstat -gcnew -t -h 5  8035@192.168.127.133 1000 3
    Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
            22704.8 6656.0 6656.0    0.0 3776.0  1  15 6656.0 142336.0  39508.8     11    0.751
            22705.8 6656.0 6656.0    0.0 3776.0  1  15 6656.0 142336.0  39508.8     11    0.751
            22706.8 6656.0 6656.0    0.0 3776.0  1  15 6656.0 142336.0  39508.8     11    0.751
    
    列名描述
    S0C第一个幸存区大小
    S1C第二个幸存区大小
    S0U第一个幸存区的使用大小
    S1U第二个幸存区的使用大小
    TT对象在新生代存活的次数
    MTT对象在新生代存活的最大次数
    DSS期望的幸存区大小
    EC伊甸园区的大小
    EU伊甸园区的使用大小
    YGC年轻代垃圾回收次数
    YGCT年轻代垃圾回收消耗时间
    • -gcnewcapacity:新生代垃圾回收统计
    [root@m ~]# jstat -gcnewcapacity -t -h 5  8035@192.168.127.133 1000 3
    Timestamp         NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
            23123.8    10240.0   155648.0   155648.0  51712.0   6656.0  51712.0   6656.0   154624.0   142336.0    11     2
            23124.8    10240.0   155648.0   155648.0  51712.0   6656.0  51712.0   6656.0   154624.0   142336.0    11     2
            23125.7    10240.0   155648.0   155648.0  51712.0   6656.0  51712.0   6656.0   154624.0   142336.0    11     2
    
    
    列名描述
    NGCMN新生代最小容量
    NGCMX新生代最大容量
    NGC当前新生代容量
    S0CMX最大幸存1区大小
    S0C当前幸存1区大小
    S1CMX最大幸存2区大小
    S1C当前幸存2区大小
    ECMX最大伊甸园区大小
    EC当前伊甸园区大小
    YGC年轻代垃圾回收次数
    FGC老年代回收次数
    • -gcold:老年代垃圾回收统计
    [root@m ~]# jstat -gcold -t -h 5  8035@192.168.127.133 1000 3
    Timestamp          MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
            23302.5  35712.0  34084.8   4480.0   4179.7     28672.0     14935.4     11     2    0.120    0.871
            23303.5  35712.0  34084.8   4480.0   4179.7     28672.0     14935.4     11     2    0.120    0.871
            23304.4  35712.0  34084.8   4480.0   4179.7     28672.0     14935.4     11     2    0.120    0.871
    
    列名描述
    MC方法区大小
    MU方法区使用大小
    CCSC压缩类空间大小
    CCSU压缩类空间使用大小
    OC老年代大小
    OU老年代使用大小
    YGC年轻代垃圾回收次数
    FGC老年代垃圾回收次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间
    • -gcoldcapacity:老年代内存统计
    [root@m ~]# jstat -gcoldcapacity -t -h 5  8035@192.168.127.133 1000 3
    Timestamp          OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
            23476.3     20480.0    311296.0     28672.0     28672.0    11     2    0.120    0.871
            23477.3     20480.0    311296.0     28672.0     28672.0    11     2    0.120    0.871
            23478.3     20480.0    311296.0     28672.0     28672.0    11     2    0.120    0.871
    
    列名描述
    OGCMN老年代最小容量
    OGCMX老年代最大容量
    OGC当前老年代大小
    OC当前老年代大小
    YGC年轻代垃圾回收次数
    FGC老年代垃圾回收次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间
    • -gcutil:总垃圾回收统计
    [root@m ~]# jstat -gcutil -t -h 5  8035@192.168.127.133 1000 3
    Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
            23612.6   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871
            23613.6   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871
            23614.6   0.00  56.73  27.76  52.09  95.44  93.30     11    0.751     2    0.120    0.871
    
    列名描述
    S0幸存1区当前使用比例
    S1幸存2区当前使用比例
    E伊甸园区使用比例
    O老年代使用比例
    M元数据区使用比例
    CCS压缩使用比例
    YGC年轻代垃圾回收次数
    YGCT年轻代垃圾回收消耗时间
    FGC老年代垃圾回收次数
    FGCT老年代垃圾回收消耗时间
    GCT垃圾回收消耗总时间
    • -printcompilation:jvm编译方式统计
    [root@m ~]# jstat -printcompilation -t -h 5  8035@192.168.127.133 1000 3
    Timestamp       Compiled  Size  Type Method
            24655.6     3277    528    1 org/apache/catalina/session/ManagerBase processExpires
            24656.6     3277    528    1 org/apache/catalina/session/ManagerBase processExpires
            24657.6     3277    528    1 org/apache/catalina/session/ManagerBase processExpires
    
    列名描述
    Compiled最近编译方法的数量
    Size最近编译方法的字节码数量
    Type最近编译方法的编译类型
    Method方法名标识

jstatd

Java Virtual Machine jstat Daemon, 基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。

jps、jstat等工具的远程调试功能都需要远程服务器开启jstatd服务

jstatd服务需要本地主机上的RMI注册表。

  1. 使用%java_home%/bin/rmiregistry [port] 命令可以创建RMI注册服务
  2. jstatd尝试连接到默认端口(1099)上的RMI注册表,或者使用-p port选项指定的端口上
  3. 如果没有找到RMI注册表,jstatd应用程序中创建内部RMI注册表,该应用程序绑定到由-p port选项指示的端口,或者在省略-p port选项时绑定到默认(1099)的RMI注册表端口
  4. 通过指定-nr选项,可以停止创建内部RMI注册表
[root@m ~]# jstatd -help
usage: jstatd [-nr] [-p port] [-n rminame]
  • 命令格式
jstatd [-nr] [-p port] [-n rminame]
  • -nr:jstatd需要本机RMI注册表,如果没找到RMI注册表,jstatd会创建内部RMI注册表,使用-nr命令后会停止创建内部RMI注册表

  • -p:jstatd连接到本机RMI注册表的端口,如果没找到RMI注册表,且没有-nr命令,jstatd会使用-p指定的端口创建内部RMI注册表

  • -n: 指定绑定到rim registry中远程服务对象的名称,默认为JStatRemoteHost;如果同一台主机上同时运行了多个jstatd服务,rminame可以用于唯一确定一个jstatd服务;这里需要注意一下,如果开启了这个选项,那么监控客户端远程连接时,必须同时指定hostid及vmid,才可以唯一确定要连接的服务

  • -Joption: 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。

jstatd安全

如果没设置其他安全管理器,jstatd将使用RMISecurityPolicy,并且需要指定安全策略文件。安全策略文件必须符合安全策略语法,通过命令-J-Djava.security.policy=filepath指定策略文件。以下的安全策略可以访问所有代码库:

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

jstatd示例

  • 没有RMI registry服务,内部创建RMI registry,使用默认1099端口
[root@m ~]# jstatd -J-Djava.security.policy=/usr/local/jdk1.8.0_191/bin/jstatd.all.policy
  • 没有RMI registry服务,内部创建RMI registry,使用指定端口
[root@m ~]# jstatd -J-Djava.security.policy=/usr/local/jdk1.8.0_191/bin/jstatd.all.policy -p 9999
  • 使用已存在的外部RMI registry服务,默认端口
[root@m ~]# rmiregistry
[root@m ~]# jstatd -J-Djava.security.policy=/usr/local/jdk1.8.0_191/bin/jstatd.all.policy -nr
  • 使用已存在的外部RMI registry服务,指定端口
[root@m ~]# rmiregistry 9999
[root@m ~]# jstatd -J-Djava.security.policy=/usr/local/jdk1.8.0_191/bin/jstatd.all.policy -p 9999 -nr

客户端连接

  • jps

    • 远程RMI registry使用默认端口1099
    [root@m ~]# jps -mlv 192.168.127.133
    6417 ray-test-log-1.0-SNAPSHOT.jar
    7270 sun.tools.jstatd.Jstatd -nr -Dapplication.home=/usr/local/jdk1.8.0_191 -Xms8m -Djava.security.policy=/usr/local/src/jstatd.all.policy
    7246 sun.rmi.registry.RegistryImpl -Dapplication.home=/usr/local/jdk1.8.0_191 -Xms8m -Xbootclasspath/p:/usr/local/jdk1.8.0_191/lib/sa-jdi.jar
    6495 sun.jvm.hotspot.jdi.SADebugServer 6417 ray -Dapplication.home=/usr/local/jdk1.8.0_191 -Xms8m
    
    • 远程RMI registry使用指定端口
    1. 配置hostname和ip映射关系,vi /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.127.132 m
    192.168.127.133 w1
    192.168.127.134 w2
    
    1. 使用hostname:port执行命令
    [root@m ~]# jps w1:9999
    6417 jar
    7521 Jstatd
    7497 RegistryImpl
    6495 SADebugServer
    
    • jstatd命令使用-n指定了名称
    [root@m ~]# jps 192.168.127.133/test2
    6560 Jstatd
    6325 jar
    3229 ray-test-log-1.0-SNAPSHOT.jar
    6509 Jstatd
    
  • jstat

    1. 首先使用jps查询pid
    [root@m ~]# jps w1:9999
    6417 jar
    7521 Jstatd
    7497 RegistryImpl
    6495 SADebugServer
    
    1. 使用pid@ip:port执行命令
    [root@m ~]# jstat -gc 6417@192.168.127.133:9999
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
    6656.0 6656.0  0.0   779.2  142336.0 22234.9   40960.0    18128.9   35200.0 33576.1 4736.0 4349.5     11    0.105   2      0.126    0.231
    
    1. jstatd命令使用-n指定了名称
    [root@m ~]# jstat -gc -h 5 3229@192.168.127.133:1099/test1 1000 10
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
    7168.0 4096.0  0.0   493.4  140800.0 75902.1   37888.0    17201.9   34224.0 32588.7 4528.0 4224.1     13    0.121   2      0.134    0.255
    7168.0 4096.0  0.0   493.4  140800.0 75902.1   37888.0    17201.9   34224.0 32588.7 4528.0 4224.1     13    0.121   2      0.134    0.255
    
举报

相关推荐

0 条评论