连续gc是怎么玩的

连续gc是怎么玩的,第1张

连续gc需要在eden区分配内存。

1、大对象直接进入到老年代。

2、小对象先在eden区分配内存,当eden满了后,触发一次Minor GC,清理eden区域。

3、存活下来的对象进入到survivor区域,年龄+1。

4、当老年代满了后触发一次Full GC。

主要发展

Java有了GC,就不需要程序员去人工释放内存空间。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间。当然,如果需要,程序员可以在Java程序中显式地使用System.gc()来强制进行一次立即的内存清理。

初始状态,假设整个堆内存大小为20M,其中老年代10M,新生代10M,新生代中Eden区6M,两个Survivor区各2M。大多数情况下,新创建的对象首先都会尝试在Eden区分配(初始年龄为0),随着程序运行,对象不断被创建,Eden区空间快要被占满了。此时,一个新的对象(1M)申请分配内存,Eden区没有足够的空间来给这个对象分配内存,如图所示:

这时候会触发一次Minor GC,把Eden区中还存活的对象转移到From区(年龄+1为1),其他对象则视为垃圾被清理掉。然后在Eden区中给新创建的那个对象分配空间。

这时会再次触发Minor GC,把Eden区和From区中存活的对象转移到To区(年龄+1为2),清理掉剩下的垃圾对象,然后在Eden区给新对象分配内存:

如果某个(些)对象(原来在年轻代中存活的对象或者新创建的对象)需要被移动到老年代中,而老年代中没有足够空间容纳这个(些)对象,那么会触发一次Full GC,Full GC会对整个堆进行清理,如果Full GC后还是无法在老年代中给这个(些)对象分配空间,那么JVM会抛出OutOfMemoryError,即OOM。

https://www.jianshu.com/p/314272e6d35b

https://blog.csdn.net/u011069294/article/details/107346634


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11655705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存