用断点机制来一步一步看虚拟机的变化
先来介绍每个参数的意义
-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 |
源码第一步:
查看虚拟机数据:
下一步
虚拟机数据对比,发现Eden多使用了2M
第三步
虚拟机数据对比
第四步:
第五步
第六步,注意了在这里再分配空间Eden存储空间就不足了要触发Young GC了
查看虚拟机数据变化
发现了什么?
发现了什么?
发生了第一次Young GC ,Eden内存不够然后就触发了Young GC回收了allocation1的内存此时做出整理将Eden与其中一个survivor的内存放入另一个survivor中,但是survivor只有1M内存不够,这是就会用到老年代的担保机制,老年代有10M内存足够于是会将Eden中的对象放入到老年代中于是老年代占用变成了4M,然后再在Eden中为新的allocation4分配2M内存,至于S1U中为什么会有416kb我也解释不清楚有知道可不吝赐教,我个人觉得应该是先复制到survivor中复制了一部分发现不足然后转移到老年代中,于是就出现了S1U中的416了,好了接着看(因为之前做实验去了不小心把窗口关掉了,从新接着上面来,只是JVMID改变了一下)
继续
接下来的三个null虚拟机参数都不会发生改变所以只截一个图
好了最后一个分配内存又要发生Young GC了Eden内存不足Survivor内存也不足存储发生Young 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赋值为空取消了
发现了什么?触发了Full GC对不对...
好了虚拟机垃圾回收机制在此就讲完了,不足的地方还望补充