学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记

概述

JVM命令之 jstat:查看JVM统计信息_老年代

基本语法

JVM命令之 jstat:查看JVM统计信息_老年代_02

其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:
JVM命令之 jstat:查看JVM统计信息_老年代_03

option参数
-gc
新生代相关
S0C是第一个幸存者区的大小(字节)
S1C是第二个幸存者区的大小(字节)
S0U是第一个幸存者区已使用的大小(字节)
S1U是第二个幸存者区已使用的大小(字节)
EC是Eden空间的大小(字节)
EU是Eden空间已使用大小(字节)
老年代相关
OC是老年代的大小(字节)
OU是老年代已使用的大小(字节)
方法区(元空间)相关
MC是方法区的大小
MU是方法区已使用的大小
CCSC是压缩类空间的大小
CCSU是压缩类空间已使用的大小
其他
YGC是从应用程序启动到采样时young gc的次数
YGCT是指从应用程序启动到采样时young gc消耗时间(秒)
FGC是从应用程序启动到采样时full gc的次数
FGCT是从应用程序启动到采样时的full gc的消耗时间(秒)
GCT是从应用程序启动到采样时gc的总时间

interval参数
用于指定输出统计数据的周期,单位为毫秒。即:查询间隔

count参数
用于指定查询的总次数

-t参数
可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒

我们执行jstat -gc -t 13152 1000 10,这代表1秒打印出1行,一共10行,-t代表打印出Timestamp总运行时间,结果如下所示:
JVM命令之 jstat:查看JVM统计信息_java_04
上方红色框框中代表Timestamp,而蓝色框框中代表垃圾回收时间,单位都是秒,如果让红色框框中的某两个值相减,假设这个值是num1,然后让对应行的蓝色框框中的另外两个值相减,假设这个值是num2,之后让num2/num1,得出的差值就是上述所说的GC时间占运行时间的比例
虽然这种方式比较繁琐,但是在项目部署之后就需要使用命令行去看了,就没有可视化界面了,所以这种方式也要会

-h参数
可以在周期性数据输出时,输出多少行数据后输出一个表头信息


演示

JVM命令之 jstat:查看JVM统计信息_jvm_05
启动上面的程序
输入下面的命令
JVM命令之 jstat:查看JVM统计信息_jvm_06
Loaded是加载类的个数
第一个Bytes是加载的类占用的字节数
Unloaded是卸载类的个数
第二个Bytes是卸载的类占用的字节数
Time是类装载花费的时间


JVM命令之 jstat:查看JVM统计信息_java_07
箭头的参数是 interval参数,
箭头的意思是1秒钟打印一次,便于我们持续的监控.会一直打印,直到程序结束了才不会打印.


JVM命令之 jstat:查看JVM统计信息_java_08
箭头的参数是打印的次数,10意思是总共会打印10次,达到10次之后就会停止打印.


JVM命令之 jstat:查看JVM统计信息_老年代_09
-t的意思是输出 从程序运行起来到现在你敲击命令的时候总共执行了多长时间,单位是秒
Timestamp就是这个时间


JVM命令之 jstat:查看JVM统计信息_jvm_10
-h3的意思是每隔三条记录输出一次表格头部


compiler是显示编译过的方法,编译过的方法的耗时,编译失败的方法等等
JVM命令之 jstat:查看JVM统计信息_java_11


打印被编译的方法

JVM命令之 jstat:查看JVM统计信息_算法_12


JVM命令之 jstat:查看JVM统计信息_算法_13
s0c 幸存者0区容量
s1c 幸存者1区容量
sou 幸存者0区已经使用的容量
s1u 幸存者1区已经使用的容量
ec 伊甸园区总容量
eu 伊甸园区已经使用的容量
oc 是老年代的总量
ou 是老年代使用的容量
mc是方法区的容量
mu是方法区使用的容量
ccsc是压缩类的总量
ccsu 是压缩类的使用容量
ygc 是young gc发生的参数
tgct 是young gc花费的时间
fgc是full gc的参数
fgct 是full gc花费的时间
gct 是总的gc的时间, 总gc花费的时间=young gc花费的时间+full gc花费的时间

jstat:如何排查OOM和内存泄漏

平时的时候可以用一些图形界面的工具查看,但是在实际生产环境,可能无法使用这些图形界面工具,只能是用jdk自带的jstat工具查看监控了.

JVM命令之 jstat:查看JVM统计信息_老年代_14
JVM命令之 jstat:查看JVM统计信息_老年代_15

启动这个main方法

JVM命令之 jstat:查看JVM统计信息_jvm_16

注意,在执行上面的命令的时候没有抛出oom异常,然后后面Java程序控制台就抛出这个异常了.
JVM命令之 jstat:查看JVM统计信息_jvm_17


JVM命令之 jstat:查看JVM统计信息_算法_18


JVM命令之 jstat:查看JVM统计信息_老年代_19
出现gc的原因

oom排查经验:
JVM命令之 jstat:查看JVM统计信息_老年代_20
经验:
我们可以比较Java进程的启动时间以及总gc的时间(gct列),或者两次测量的间隔时间以及总gc的时间的增量(执行gc花了多少时间),来得出gc执行时间占程序运行时间的比例.

JVM命令之 jstat:查看JVM统计信息_老年代_20
上面两个红框的之间的数据的gct时间之和 除以 上面两个红框的之间的数据的 Timestamp时间之和,来得到垃圾回收的时间占用程序执行的总共时间的比例
如果这个比例超过20%,就说明目前的堆压力较大, 因为垃圾回收的时间稍微多了一点,如果这个比例超过90%了,那就意味着程序执行的时间百分之90的时间都用来垃圾回收了,说明内存空间基本上就没有什么了,那么随时就有可能出现oom异常了.

用jstat判别内存泄露问题

补充
JVM命令之 jstat:查看JVM统计信息_老年代_22
第1步可以执行命令:jstat -gc -t 13152 1000 20

JVM命令之 jstat:查看JVM统计信息_java_23

每隔一段时间观察一下 ou 参数, 如果 ou参数(老年代内存使用量)的占用越来越高,这个情况就是老年代无法回收的对象在不断增长, 你就要想想,为什么gc没有把这些对象清理掉,估计就有可能出现内存泄露情况了.

jstatd:远程主机信息收集

因为我们要监控的数据不一定是本地的,很多要监控的数据是线上linux上的,这个时候就需要用jstatd这个工具进行远程监控了。

命令jstatd是一个rmi服务端程序,作用相当于代理服务器,建立本地计算机与远程监控工具的通信,jstatd服务器将本机的Java应用程序信息传递到远程计算机上。
JVM命令之 jstat:查看JVM统计信息_java_24