一文快速读懂Java虚拟机的GC日志
读懂Java虚拟机的GC日志是处理Java虚拟机内存问题的基本技能。GC日志只是一些人为设定的规则,没有什么技术含量。下面我们就来看看GC日志该怎么理解吧。
首先,Java虚拟机的垃圾回收机制中有一个关键组件-垃圾回收器。到目前为止,Java虚拟机已经实现了5类垃圾收集器分别为:Serial收集器,parnew收集器,parallel scavenge收集器,Serial Old收集器,parallel old 收集器 ,cms收集器,g1收集器。
GC日志就是以上各收集器运行的过程中内存变化的一些日志。而每一种收集器的日志都是由他们自身的实现来决定的,换言之,每种收集器的日志格式都可以不一样,但是虚拟机的设计者为了用户方便阅读,将各个收集器的日志保持一定的共性。
我们来看下面的日志:
一文快速读懂Java虚拟机的GC日志
GC日志开头的“[GC”或“[Full GC”表明这次垃圾收集的停顿类型,不是用来区分新生代GC还是老年代GC的。如果有Full ,说明这次GC发生了“Stop-The-World"
接下来PSYoungGen 表示的是GC发生的区域,是新生代,这里显示的名称与使用的垃圾收集器是密切相关的。如果使用Parallel Scanvenge垃圾收集器,这里的名字就会显示为”PSYoungGen“。垃圾收集器为Parallel Scanvenge 是一款并行的垃圾收集器,特点为重视吞吐量,而不是gc停顿时间,可以设置自动调节新生代eden区的比率大小和晋升老年代的年龄等参数。
老年代和永久代同理,名称也是由垃圾收集器决定的。
除此之外,还有ParNew ,表明用的垃圾收集器是ParNew 一款并行垃圾收集器,defNew表明用的是默认的serial垃圾收集器,单线程的垃圾收集器。
知道了是什么垃圾收集器,自然就知道他们是作用在那个代进行垃圾回收。
后面方括号内的”6305K->776K(9216K)“意思是GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”而在方括号之外的“6305K->4880K(19456K)”表示前Java堆已使用空间->GC后Java堆已使用空间(Java堆总容量)。
再往后“0.0061795 secs”表示本次GC所占用的时间,单位是秒。再往后的“[Times: user=0.00 sys=0.00, real=0.01 secs]”是更为详细的数据。user表示用户态消耗的cpu时间;sys表示内核态消耗的cpu时间;real是操作从开始到结束所经过的时间。由于系统有可能并发/并行工作,所以会出现user+sys>real的情况。
新生代日志信息
一文快速读懂Java虚拟机的GC日志
第一行 表明是新生代 Parallel Scanvenge 垃圾收集器
总大小为9216k ,已使用7157k ,eden区空间为8192k, 已经被使用77%
from survivor和to survivor区大小为1024k,其中from survivor已使用75%,tosurvivor未被使用
老年代日志信息
一文快速读懂Java虚拟机的GC日志
老年代用的是ParOldGen 表示是用的paraller old 收集器, 是parallel scavenge的老年代版本,使用多线程和 标记-整理 算法。 除了这个之外 还有serial old和cms收集器。
总大小为10240k,已经使用4104k,对象空间已经被使用40%。
好了,以上内容由十号笔记整理分享。希望可以帮助到有需要的同学,觉得有帮助的同学可以点赞收藏,也可以转发分享给我们身边的同学一起学习哦!喜欢十号笔记分享的朋友也可以关注一下,每天都会为大家送上不一样的后端技术知识,更多话题也可以在评论区中继续交流与吐槽哦!