Java虚拟机那些事儿(十三):Java基本命令jps、jinfo、jstat

没事的时候在回顾自己的博客,刚好这段时间朋友在外面面试,根据他的反馈也做了很多了解。JVM对于Java开发人员来说是面试的重中之重,也是最难的,因为内部的东西太多,没有一个系统的学习方案,都是东一块西一块的学习,最终导致这方面的知识都是由记忆碎片拼接,不全面也不系统。之前的十几篇博客都是转载自其他的博客,接下来还会借鉴别人的博客来完善整个Java虚拟机的知识体系。

这篇博客让我们一起了解一下jpsjinfojstat命令的使用,以及输出数据的理解。本文章借鉴于一下两篇博客:

java高分局之jstat命令使用

初步诊断你的GC

JPS:查看Java进程

通过jps命令可以查看当前运行的Java进程,输出的信息包含进程ID和进程的名称,如下:

joker@yangbaodeMacBook-Pro:~/joker$ jps
60608 Launcher
60609 IcaApplication
283
56220 Launcher
63759 Jps

其中IcaApplication就是本地启动的一个Java项目。在用jps是很多java命令的基础,因为在执行jstatjinfo命令的时候都需要指定需要查看的进程,那么进程ID就是必须要知道的啦。

注意:如果你电脑的环境变量里面没有配置JDK的path,那么jpsjstatjinfo等命令都是用不了的,需要配置一下。(如何配置网上资源很多,不赘述)

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参数是一个公共的参数,如jpsjstat等命令都可以接收这个参数。 由于jpsjstat命令本身也是 Java 应用程序, -J参数可以为jps等命令本身设置 Java 虚拟机参数。

-Djava.security.policy:指定策略文件
-Djava.rmi.server.hostname:指定服务器的ip地址(可忽略)

接下来使用下面的命令就可以看到远程机器192.168.1.101上Java进程的信息啦。命令如下:

jps 192.168.1.101

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选项对应的信息是什么,可以尝试看一下,不赘述啦。

JSTAT:查看堆内存信息

这个命令是非常重要,也是最常用的,每一个选项使用都比较重要,接下来将依次说一下。

表达式

表达式和上面的命令介绍一样,复杂的通过jstat -h查看,常用下面来说。

  • 查询选项列表

    jstat -options
    
  • 查询堆内存信息核心命令

    jstat -<option> <pid> [<interval> [<count>]]
    

    option:代表选项信息,具体有哪些选项,使用选项列表命令就可以查询

    pid:进程ID,不赘述

    interval:间隔时间,表示每隔多长时间打印出一条选项指定的信息,单位有毫秒(ms)和秒(s),默认单位是毫秒(ms)

    count:表示打印多少条数据和interval参数配合,用于每隔多长时间打一条,总共打印多少条数据

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:加载所消耗时间
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:失败的方法
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总消耗时间
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次数
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消耗时间
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次数
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总消耗时间
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总消耗时间
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总消耗时间
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:方法名标识
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总消耗时间
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的原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿洞晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值