JVM监控及诊断工具-命令行篇
一、概述
简单命令行工具:
以上
.jar
的程序源码在
tools.jar
中
二、jps:查看正在运行的Java进程
ps -ef|grep java
1、基本情况
2、测试
根据基本语法进行测试即可
3、基本语法
可以通过
jps -help
来查看对应的参数信息
①options参数
综合使用:
jps -l -m等价于jps -lm
如何将信息输出到同级文件中:
语法:命令 > 文件名称
例如:jps -l > a.txt
②hostid参数
三、jstat:查看JVM统计信息
1、基本情况
通过命令行的方式,纯文本的方式去监视
整个内存JVM的占用
2、基本语法
其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:
①option参数
- 打印编译所花费的时间次数等信息:↓
- 打印被jit编译器编译过的方法:↓
1、-class举例:
简单使用:↓
h3 中的3代表每隔3个分隔一次,
13344 代表类的进程id,
1000 代表每隔1000毫秒打印一次,
10 代表一共打印10次,
如下所示:
Timestamp代表:程序至今的运行时间,单位为秒;
Loaded代表:加载的类的数目;
Bytes代表:加载的类的总字节数;
Unloaded代表:卸载的类的数目;
Bytes代表:卸载的类的总字节数;
Time代表:类装载所消耗的时间;
2、-gc举例:
13344代表类的进程id,执行结果如下所示:
S0C:代表幸存者0区的总容量,
S1C:代表幸存者1区的总容量,
S0U:代表幸存者0区使用的容量,
S1U:代表幸存者1区使用的容量,
EC:代表伊甸园区的总容量,
EU:代表伊甸园区使用的总容量,
OC:代表老年代的总容量,
OU:代表老年代已经使用的容量,
MC:代表方法区的总容量,
MU:代表方法区的总容量,
CCSC:代表压缩类的总容量,
CCSU:代表压缩类使用的容量,
YGC:代表年轻代垃圾回收的次数,
YGCT:年轻代进行垃圾回收需要的时间,
FGC:代表代表Full GC的次数,
FGCT:代表Full GC的时间,
GCT:代表垃圾回收的总时间
3、-gccapacity举例:
13344代表类的进程id,执行结果如下:
其中S0C代表幸存者0区的容量,S1C代表幸存者1区的容量,EC代表伊甸园区的容量,CCSC代表压缩类的容量,YGC代表年轻代垃圾回收的时间,FGC代表Full GC垃圾回收的时间
4、-gcutil举例:
查看堆内存空间占比情况
13152代表类的进程id,执行结果如下所示:
以上是
各区域占比以及垃圾回收的情况
,S0代表幸存者0区,S1代表幸存者1区,E代表伊甸园区,O代表老年代,M代表方法区,CCS代表压缩类,以上这些值都是占比情况,YGC代表年轻代垃圾回收的次数,YGCT年轻代进行垃圾回收需要的时间,FGC代表代表Full GC的次数,FGCT代表Full GC的时间,GCT代表垃圾回收的总时间
5、-gccause举例:
发生GC的原因
13344代表类的进程id,执行结果如下:
以上是
各区域占比以及垃圾回收的情况,还有触发垃圾回收的原因解释
,S0代表幸存者0区,S1代表幸存者1区,E代表伊甸园区,O代表老年代,M代表方法区,CCS代表压缩类,以上这些值都是占比情况,YGC代表年轻代垃圾回收的次数,YGCT年轻代进行垃圾回收需要的时间,FGC代表代表Full GC的次数,FGCT代表Full GC的时间,GCT代表垃圾回收的总时间,LGCC和GCC代表垃圾回收的原因
②interval参数
用于指定输出统计数据的周期,单位为毫秒。即:
查询间隔
,每个多少时间查询一次
③count参数
用于
指定查询的总次数
④-t参数
可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒
经验:↓
执行jstat -gc -t 13152 1000 10,这代表1秒打印出1行,一共10行,-t代表打印出Timestamp总运行时间,结果如下所示:
上方红色框框中代表Timestamp,而蓝色框框中代表垃圾回收时间,单位都是秒,如果让红色框框中的某两个值相减,假设这个值是num1,然后让对应行的蓝色框框中的另外两个值相减,假设这个值是num2,之后让num2/num1,得出的差值就是上述所说的GC时间占运行时间的比例
虽然这种方式比较繁琐,但是在项目部署之后就需要使用命令行去看了,就没有可视化界面了,所以这种方式也要会
左侧的是通过
-t
,知道程序执行的时间,两段可以相减算出这段时间内右侧GC时间相减获得这段时间的GC时间,右侧除以左侧,就可以算出垃圾回收时间占这段程序执行时间的比例,如果
比例超过20%
,就表明堆的压力比较大了
⑤-h参数
可以在周期性数据输出时,输出多少行数据后输出一个表头信息
3、补充
第1步可以执行命令:
jstat -gc -t 14024 1000 10
一段时间内抽取OU中的最小值,进行比较,如果发现不断上涨,就出现内存泄露
四、jinfo:实时查看和修改JVM配置参数
主要用来获取某一个参数的值,修改比较少
1、基本情况
Bean对象get/set()
2、基本语法
①查看
- jinfo -sysprops 进程id
可以查看由System.getProperties()取得的参数
进程id可以通过jps命令查看,操作结果如下:
- jinfo -flags 进程id
查看当前进程曾经赋过值的一些参数情况
进程id可以通过jps命令查看,参数赋值的一部分是我们自己设置的,另外一部分是系统自动优化设置的参数信息,具体操作如下:
- jinfo -flag 参数名称 进程id
查看某个java进程的具体参数的信息
进程id可以通过jps命令查看
②修改
- 针对boolean类型
jinfo -flag [+|-]参数名称 进程id
PID可以通过jps命令查看,如果使用+号,那就可以让该参数起作用,否则使用-号就让该参数不起作用
- 针对非boolean类型
jinfo -flag 参数名称=参数值 进程id
PID可以通过jps命令查看,如果使用+号,那就可以让该参数起作用,否则使用-号就让该参数不起作用
3、拓展
①java -XX:+PrintFlagsInitial
查看所有JVM参数启动的
初始值
②java -XX:+PrintFlagsFinal
查看所有JVM参数的
最终值
③java -参数名称:+PrintCommandLineFlags
查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值
五、jmap:导出内存映像文件&内存使用情况
关注更多
堆空间
的情况
1、基本情况
jvm
堆
内存映射
将某个阶段的内存情况映射成一个快照文件
生成的dump文件是不能通过记事本直接打开的,因为他是二进制文件
2、基本语法
1、使用语法可以通过在DOS窗口中使用jmap/jmap -h/jmap -help查看
2、代表可执行的代码,比如使用> 文件名称来指定生成的dump文件的生成位置
3、[server_id@]是为远程连接准备的
3、使用1:导出内存映像文件
注意:
- 对于以上说明中的第1点是自动方式才会这样做,而手动不会在Full GC之后生成Dump
- 使用手动方式生成dump文件,一般指令执行之后就会生成,不用等到快出现OOM的时候
- 使用自动方式生成dump文件,当出现OOM之前先生成dump文件
- 如果使用手动方式,一般使用第2种,毕竟生成堆中存活对象的dump文件是比较小的,便于传输和分析
①手动的方式
说明:
- 中的
,而filename是文件名称
,代表该值可以省略,当然后面的是进程id,需要通过jps查询出来.hprof是后缀名
-
,用来进行格式限定format=b表示生成的是标准的dump文件
生成堆中所有对象的快照:
生成堆中存活对象的快照:
其中
file
=后面的是生成的dump文件地址,最后的11696是进程id,可以通过jps查看
一般使用的是第二种方式,也就是生成堆中存活对象的快照
,毕竟这种方式生成的dump文件更小,我们传输处理都更方便
jmap -dump:format=b,file=<filename.hprof> < pid > #生成堆中所有对象的快照
jmap -dump:live,format=b,file=<filename.hprof> < pid > #生成堆中存活对象的快照
②自动的方式
在快要发生OOM之前,自动生成dump文件
具体使用如下:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>
#比如
-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:heapDumpPath=D:\m.hprof
4、使用2:显示堆内存相关信息
获取展示运行指令的
这一刻
的堆内存情况,且返回的数据必然是在
安全点上
①jmap -heap 进程id
jmap -heap 进程id只是时间点上的堆信息,而jstat后面可以添加参数,可以指定时间动态观察数据改变情况,而图形化界面工具,例如jvisualvm等,它们可以用图表的方式动态展示出相关信息,更加直观明了
②jmap -histo 进程id
输出堆中对象的同级信息,包括类、实例数量和合计容量,也是这一时刻的内存中的对象信息
5、使用3:其他作用
这两个指令仅linux/solaris平台有效,所以无法在windows操作平台上演示,并且使用比较小众,不在多说
- jmap -permstat 进程id
查看系统的ClassLoader信息
- jmap -finalizerinfo
查看堆积在finalizer队列中的对象
6、小结
因为他jmap所获取到的数据是借助安全点的,因此会出现数据结果的偏差情况
六、jhat:JDK自带堆分析工具
去分析用jmap导出的dump文件
jhat命令在jdk9及其之后就
被移除
了,官方建议使用jvisualvm代替jhat,所以该指令只需简单了解一下即可
1、基本情况
2、基本语法
其中dumpfile代表dump文件的地址以及名称,例如:
- options参数
举例如下:
提供了端口为7000的一个界面:↓
七、jstack:打印JVM中线程快照
打印单独jvm进程中的所有
线程
的状态快照
1、基本情况
2、基本语法
总结:
如果程序出现等待问题,可以使用该指令去查看问题所在,结果中也会提示你问题所在
八、jcmd:多功能命令行
一个顶多个,真的很强,终极缝合怪
1、基本情况
2、基本语法
- jcmd 进程号 具体命令
首先通过jcmd 进程号 help得出以下命令列表:
根据以上命令来替换之前的那些操作:
- Thread.print 可以替换 jstack指令
- GC.class_histogram 可以替换 jmap中的-histo操作
- GC.heap_dump 可以替换 jmap中的-dump操作
- GC.run 可以查看GC的执行情况
- VM.uptime 可以查看程序的总执行时间,可以替换jstat指令中的-t操作
- VM.system_properties 可以替换 jinfo -sysprops 进程id
- VM.flags 可以获取JVM的配置参数信息
- 等…