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)
- hostid完整格式为
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(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) 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注册表。
- 使用%java_home%/bin/rmiregistry [port] 命令可以创建RMI注册服务
- jstatd尝试连接到默认端口(1099)上的RMI注册表,或者使用-p port选项指定的端口上
- 如果没有找到RMI注册表,jstatd应用程序中创建内部RMI注册表,该应用程序绑定到由-p port选项指示的端口,或者在省略-p port选项时绑定到默认(1099)的RMI注册表端口
- 通过指定-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使用指定端口
- 配置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
- 使用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
- 首先使用jps查询pid
[root@m ~]# jps w1:9999 6417 jar 7521 Jstatd 7497 RegistryImpl 6495 SADebugServer
- 使用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
- 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