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

概述

image.png

基本语法

image.png

其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:
image.png

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总运行时间,结果如下所示:
image.png
上方红色框框中代表Timestamp,而蓝色框框中代表垃圾回收时间,单位都是秒,如果让红色框框中的某两个值相减,假设这个值是num1,然后让对应行的蓝色框框中的另外两个值相减,假设这个值是num2,之后让num2/num1,得出的差值就是上述所说的GC时间占运行时间的比例
虽然这种方式比较繁琐,但是在项目部署之后就需要使用命令行去看了,就没有可视化界面了,所以这种方式也要会

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


演示

image.png
启动上面的程序
输入下面的命令
image.png
Loaded是加载类的个数
第一个Bytes是加载的类占用的字节数
Unloaded是卸载类的个数
第二个Bytes是卸载的类占用的字节数
Time是类装载花费的时间


image.png
箭头的参数是 interval参数,
箭头的意思是1秒钟打印一次,便于我们持续的监控.会一直打印,直到程序结束了才不会打印.


image.png
箭头的参数是打印的次数,10意思是总共会打印10次,达到10次之后就会停止打印.


image.png
-t的意思是输出 从程序运行起来到现在你敲击命令的时候总共执行了多长时间,单位是秒
Timestamp就是这个时间


image.png
-h3的意思是每隔三条记录输出一次表格头部


compiler是显示编译过的方法,编译过的方法的耗时,编译失败的方法等等
image.png


打印被编译的方法

image.png


image.png
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工具查看监控了.

image.png
image.png

启动这个main方法

image.png

注意,在执行上面的命令的时候没有抛出oom异常,然后后面Java程序控制台就抛出这个异常了.
image.png


image.png


image.png
出现gc的原因

oom排查经验:
image.png
经验:
我们可以比较Java进程的启动时间以及总gc的时间(gct列),或者两次测量的间隔时间以及总gc的时间的增量(执行gc花了多少时间),来得出gc执行时间占程序运行时间的比例.

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

用jstat判别内存泄露问题

补充
image.png
第1步可以执行命令:jstat -gc -t 13152 1000 20

image.png

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

jstatd:远程主机信息收集

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

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