没事的时候在回顾自己的博客,刚好这段时间朋友在外面面试,根据他的反馈也做了很多了解。JVM对于Java开发人员来说是面试的重中之重,也是最难的,因为内部的东西太多,没有一个系统的学习方案,都是东一块西一块的学习,最终导致这方面的知识都是由记忆碎片拼接,不全面也不系统。之前的十几篇博客都是转载自其他的博客,接下来还会借鉴别人的博客来完善整个Java虚拟机的知识体系。
这篇博客让我们一起了解一下jps
、jinfo
、jstat
命令的使用,以及输出数据的理解。本文章借鉴于一下两篇博客:
1. JPS:查看Java进程
通过jps
命令可以查看当前运行的Java进程,输出的信息包含进程ID和进程的名称,如下:
joker@yangbaodeMacBook-Pro:~/joker$ jps
60608 Launcher
60609 IcaApplication
283
56220 Launcher
63759 Jps
其中IcaApplication
就是本地启动的一个Java项目。在用jps
是很多java命令的基础,因为在执行jstat
、jinfo
命令的时候都需要指定需要查看的进程,那么进程ID就是必须要知道的啦。
注意:如果你电脑的环境变量里面没有配置JDK的path,那么jps
、jstat
、jinfo
等命令都是用不了的,需要配置一下。(如何配置网上资源很多,不赘述)
jps
命令不仅可以查看本地机器的Java进程信息,还可以查看远程机器上同样信息。但是需要远程机器打开jstatd
服务。
启动jstatd
服务,需要有足够的权限。 需要使用 Java 的安全策略分配相应的权限。
创建jstatd.all.policy
策略文件。
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
启动jstatd
服务器命令:
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.101
-J
参数是一个公共的参数,如jps
、jstat
等命令都可以接收这个参数。 由于jps
、jstat
命令本身也是 Java 应用程序, -J
参数可以为jps
等命令本身设置 Java 虚拟机参数。
-Djava.security.policy
:指定策略文件-Djava.rmi.server.hostname
:指定服务器的ip地址(可忽略)
接下来使用下面的命令就可以看到远程机器192.168.1.101
上Java进程的信息啦。命令如下:
jps 192.168.1.101
2. JINFO:查看Java信息详细
jinfo
使用的详细表达式格式可以用jinfo -h
,很详细,下面提供一个精简版的,基本囊括日常使用。
表达式如下:
本地:jinfo [option] <pid>
远程:jinfo [option] [server_id@]<remote server IP or hostname>
option选项:
-flag <name> ### 查看flag信息,指定名称
-flag [+|-]<name> ### 增加和删除flag,根据名称
-flag <name>=<value> ### 设置falg的值
-flags ### 查看当前进程所有的flag参数
-sysprops ### 查看系统配置
如果直接使用jinfo+pid
,查看的是sysprops+flags
的全量信息,一般关注的比较多的是flags
参数,这些参数主要是虚拟的参数(heap的大小、垃圾回收策略等)。如下:
joker@yangbaodeMacBook-Pro:~/joker$ jinfo -flags 3660
Attaching to process ID 3660, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.73-b02
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:+ManagementServer -XX:MaxHeapSize=2063597568 -XX:MaxNewSize=687865856 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:2298,suspend=y,server=n -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=2297 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true
其他的option选项对应的信息是什么,可以尝试看一下,不赘述啦。
3. JSTAT:查看堆内存信息
这个命令是非常重要,也是最常用的,每一个选项使用都比较重要,接下来将依次说一下。
表达式和上面的命令介绍一样,复杂的通过jstat -h
查看,常用下面来说。
查询选项列表
jstat -options
查询堆内存信息核心命令
jstat -<option> <pid> [<interval> [<count>]]
option
:代表选项信息,具体有哪些选项,使用选项列表命令就可以查询pid
:进程ID,不赘述interval
:间隔时间,表示每隔多长时间打印出一条选项指定的信息,单位有毫秒(ms)和秒(s),默认单位是毫秒(ms)count
:表示打印多少条数据和interval
参数配合,用于每隔多长时间打一条,总共打印多少条数据
3.1 option选项之类加载统计:class
执行的命令如下:
# 命令
jstat -class 3660 3s 10
#输出内容
Loaded Bytes Unloaded Bytes Time
8376 15596.5 0 0.0 4.65
- Loaded:加载class的数量
- Bytes:加载class所占用空间
- Unloaded:未加载数量
- Bytes:未加载所占空间
- Time:加载所消耗时间
3.2 option选项之编译统计:compiler
执行的命令如下:
# 命令
jstat -compiler 3660
#输出内容
Compiled Failed Invalid Time FailedType FailedMethod
4573 4 0 1.47 1 com/sun/beans/TypeResolver prepare
- Compiled:编译总数量
- Failed:编译失败数量
- Invalid:不可用数量
- Time:编译使用时间
- FailedType:失败类型
- FailedMethod:失败的方法
3.3 option选项之垃圾回收统计:gc
执行的命令如下:
# 命令
jstat -gc 3660 1s
#输出内容
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
17920.0 16384.0 0.0 15143.8 330240.0 114840.3 157696.0 23503.7 41600.0 40645.8 5504.0 5249.8 9 0.090 2 0.083 0.173
- S0C:S0空间总容量
- S1C:S1空间总容量
- S0U:SO空间使用量
- S1U:S1空间使用量
- EC:Eden空间总容量
- EU:Eden空间使用量
- OC:老年代空间总容量
- OU:老年代空间使用量
- MC:元数据区空间总容量
- MU:元数据区空间使用量
- CCSC:压缩类空间总容量
- CCSU:压缩类空间使用量
- YGC:年轻代GC次数
- YGCT:年轻代GC消耗时间
- FGC:老年代GC次数
- FGCT:老年代GC消耗时间
- GCT:GC总消耗时间
3.4 option选项之堆内存统计:gccapacity
执行的命令如下:
# 命令
jstat -gccapacity 3660 1s
#输出内容
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
87040.0 1397760.0 464384.0 17920.0 16384.0 330240.0 175104.0 2796544.0 157696.0 157696.0 0.0 1085440.0 41600.0 0.0 1048576.0 5504.0 9 2
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:first Survivor空间容量
- S1C:second Survivor空间容量
- EC:Eden空间总容量
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代容量
- OC:当前老年代容量
- MCMN:最小元数据空间容量
- MCMX:最大元数据空间容量
- MC:当前元数据空间容量
- CCSMN:最小压缩类空间容量
- CCSMX:最大压缩类空间容量
- CCSC:当前压缩类空间容量
- YGC:年轻代GC次数
- FGC:老年代GC次数
3.5 option选项之新生代垃圾回收统计:gcnew
执行的命令如下:
# 命令
jstat -gcnew 3660 1s
#输出内容
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
16896.0 14848.0 0.0 14833.3 1 15 16896.0 297984.0 228277.6 11 0.249
- S0C:S0空间总容量
- S1C:S1空间总容量
S0U:S0空间使用量 - S1U:S1空间使用量
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区容量
- EC:Eden空间大小
- EU:Eden空间使用量
- YGC:年轻代GC次数
- YGCT:年轻代GC消耗时间
3.6 option选项之新生代内存统计:gcnewcapacity
执行命令如下:
# 命令
jstat -gcnewcapacity 3660 1s
#输出内容
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
41984.0 671744.0 429056.0 223744.0 16896.0 223744.0 14848.0 670720.0 297984.0 11 2
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代大小
- S0CMX:S0空间最大容量
- S0C:当前S0空间容量
- S1CMX:S1空间最大容量
- S1C:当前S1空间容量
- ECMX:Eden空间最大容量
- EC:当前Eden空间容量
- YGC:年轻代GC次数
- FGC:老轻代GC次数
3.7 option选项之老年代垃圾回收统计:gcold
执行命令如下:
# 命令
jstat -gcold 3660 1s
#输出内容
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
42112.0 41034.9 5504.0 5250.5 89088.0 25088.0 11 2 0.246 0.495
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- OC:老年代空间大小
- OU:老年代空间使用大小
- YGC:年轻代GC次数
- FGC:老年代GC次数
- FGCT:老年代GC耗时时间
- GCT:GC总消耗时间
3.8 option选项之老年代内存统计:gcoldcapacity
执行命令如下:
# 命令
jstat -gcoldcapacity 3660 1s
#输出内容
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
84992.0 1343488.0 89088.0 89088.0 11 2 0.246 0.495
- OGCMN:老年代最大容量
- OGCMX:老年代最小容量
- OGC:当前老年代大小
- OC:老年代大小
- YGC:年轻代GC次数
- FGC:老年代GC次数
- FGCT:老年代GC耗时时间
- GCT:GC总消耗时间
3.9 option选项之元数据空间统计:gcmetacapacity
执行命令如下:
# 命令
jstat -gcmetacapacity 3660 1s
#输出内容
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1085440.0 42112.0 0.0 1048576.0 5504.0 11 2 0.246 0.495
- MCMN:元数据空间最小容量
- MCMX:元数据空间最大容量
- MC:当前元数据空间大小
- CCSMN:压缩类最小容量
- CCSMX:压缩类最大容量
- CCSC:当前压缩类空间大小
- YGC:年轻代GC次数
- FGC:老年代GC次数
- FGCT:老年代GC耗时时间
- GCT:GC总消耗时间
3.10 option选项之JVM编译方法统计:printcompilation
执行命令如下:
# 命令
jstat -printcompilation 3660 1s
#输出内容
Compiled Size Type Method
6056 203 1 org/apache/commons/pool2/impl/GenericObjectPool ensureIdle
- Compiled:最近编译方法的数量
- Size:最近编译方法的字节码数量
- Type:最近编译方法的编译类型
- Method:方法名标识
3.11 option选项之总结垃圾回收统计:gcutil
执行命令如下:
# 命令
jstat -gcutil 3660 1s
#输出内容
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 99.90 76.61 28.16 97.44 95.39 11 0.249 2 0.246 0.495
- S0:S0使用比例
- S1:S1使用比例
- E:Eden使用比例
- O:老年代使用比例
- M:方法区使用比例
- CCS:压缩类分区使用比例
- YGC:年轻代GC次数
- YGCT:年轻代GC消耗时间
- FGC:老年代GC次数
- FGCT:老年代GC消耗时间
- GCT:GC总消耗时间
3.12 option选项之GC发生原因:gccause
执行命令如下:
# 命令
jstat -gccause 3660 1s
#输出内容
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 99.90 76.61 28.16 97.44 95.39 11 0.249 2 0.246 0.495 Allocation Failure No GC
- S0:S0分区空间使用比例
- S1:S1分区空间使用比例
- E:Eden分区空间使用比例
- O:老年代分区空间使用比例
- M:方法区空间使用比例
- CCS:压缩类空间使用比例
- YGC:年轻代GC次数
- YGCT:年轻代GC消耗时间
- FGC:老年代GC次数
- FGCT:老年代GC消耗时间
- GCT:GC总消耗时间
- LGCC:最后一次GC的原因
- GCC:当前GC的原因