深入了解java虚拟机之GC回收机制

时间:2022-04-19 17:35:51

用断点机制来一步一步看虚拟机的变化

先来介绍每个参数的意义

-GC 

参数 含义
S0C Survivor1总空间
S1C Survivor2总空间
S0U Survivor1已用空间
S1C Survivor2已用空间
EC Eden总空间
EU Eden已用空间
OC Old总空间
OU Old已用空间
PC Permanent总空间
PU Permanent已用空间
YGC Young GC次数
YGCT Young GC总时间
FGC Full GC次数
FGCT Full GC总时间
GCT GC总时间,包括Young GC和Full GC

源码第一步:

深入了解java虚拟机之GC回收机制

查看虚拟机数据:

深入了解java虚拟机之GC回收机制

下一步

深入了解java虚拟机之GC回收机制

虚拟机数据对比,发现Eden多使用了2M

深入了解java虚拟机之GC回收机制

第三步

深入了解java虚拟机之GC回收机制

虚拟机数据对比

深入了解java虚拟机之GC回收机制

第四步:

深入了解java虚拟机之GC回收机制

深入了解java虚拟机之GC回收机制


第五步

深入了解java虚拟机之GC回收机制


深入了解java虚拟机之GC回收机制

第六步,注意了在这里再分配空间Eden存储空间就不足了要触发Young GC了

深入了解java虚拟机之GC回收机制

查看虚拟机数据变化

深入了解java虚拟机之GC回收机制

发现了什么?

发现了什么?

发生了第一次Young GC ,Eden内存不够然后就触发了Young GC回收了allocation1的内存此时做出整理将Eden与其中一个survivor的内存放入另一个survivor中,但是survivor只有1M内存不够,这是就会用到老年代的担保机制,老年代有10M内存足够于是会将Eden中的对象放入到老年代中于是老年代占用变成了4M,然后再在Eden中为新的allocation4分配2M内存,至于S1U中为什么会有416kb我也解释不清楚有知道可不吝赐教,我个人觉得应该是先复制到survivor中复制了一部分发现不足然后转移到老年代中,于是就出现了S1U中的416了,好了接着看(因为之前做实验去了不小心把窗口关掉了,从新接着上面来,只是JVMID改变了一下)

深入了解java虚拟机之GC回收机制

深入了解java虚拟机之GC回收机制

继续

深入了解java虚拟机之GC回收机制


深入了解java虚拟机之GC回收机制


接下来的三个null虚拟机参数都不会发生改变所以只截一个图

深入了解java虚拟机之GC回收机制


深入了解java虚拟机之GC回收机制

好了最后一个分配内存又要发生Young GC了Eden内存不足Survivor内存也不足存储发生Young GC

深入了解java虚拟机之GC回收机制

深入了解java虚拟机之GC回收机制

是吧,发生了第二次Young GC动作跟第一次一样先做清理工作然后将Eden的东西与其中一个Survivor的东西复制到另一个Survivor,此时发现另一个Survior内存是足够的,注意了释放了三个allocation 此时Eden 里的对象都没了只剩下了400kb而另一个空的survivor内存有1M是足够存储的所以直接将已使用的survivor的东西与Eden的东西复制到另一个空的Survivor中,如此循环往复。


好了介绍了新生代GC那什么时候触发Full GC呢?当触发了一个Young GC时发现survivor内存不足时会想到老年代担保,但如果此时老年代内存也不足时,就会触发Full GC了,看下面的例子,注意了,这次把allocation4,5,6赋值为空取消了

深入了解java虚拟机之GC回收机制

深入了解java虚拟机之GC回收机制

深入了解java虚拟机之GC回收机制

发现了什么?触发了Full GC对不对...

好了虚拟机垃圾回收机制在此就讲完了,不足的地方还望补充