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

╰+哭是因爲堅強的太久メ 2022-06-13 11:55 244阅读 0赞

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

先来介绍每个参数的意义

-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

源码第一步:

Center

查看虚拟机数据:

Center 1

下一步

Center 2

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

Center 3

第三步

Center 4

虚拟机数据对比

Center 5

第四步:

Center 6

Center 7

第五步

Center 8

Center 9

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

Center 10

查看虚拟机数据变化

Center 11

发现了什么?

发现了什么?

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

Center 12

Center 13

继续

Center 14

Center 15

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

Center 16

Center 17

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

Center 18

Center 19

是吧,发生了第二次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赋值为空取消了

Center 20

Center 21

Center 22

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

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

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm虚拟内存回收GC

    jvm虚拟机特性之内存分配与回收 java与c系语言最大的区别之一就是内存的回收,在C或C++中需要程序员主动释放掉不再需要的内存空间,而在java中这一切都交由jvm处理