JVM分代收集算法---最详细易懂的图解方式

本文详细介绍了JVM的分代收集算法,包括MinorGC的过程,对象在Eden、SurvivalTo和SurvivalFrom区的移动以及如何判断对象进入老年代。在多次GC后,对象年龄增长,当达到特定阈值时会进入OldGeneration。当老年代空间不足时,触发FullGC。整个过程确保了内存的有效管理和高效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM分代收集算法图解

  • 在第一次进行Minor GC时,对于Eden区新创建的对象大部分是垃圾对象,对于少数活跃的对象会被复制到Survival To区中,并且让其寿命加1,内存图如下图所示。
    在这里插入图片描述

  • 紧接着会把To区的对象都会被通过复制算法,复制到From区。此时Eden区和Survival To区的都是空闲的,内存图如下所示:
    在这里插入图片描述

  • 程序继续运行,经过第一次GC,Eden又可以保存新建对象了,随着程序的运行,此时Eden区的内存又满了。需要进行第二次GC操作,同第一次一样,暂时活跃的对象,需要复制到Survival To区,同时当熬过这一次GC时,对象的年龄加1,进行保存。和第一次GC不同的是,此时Survival From区中也有幸存的对象,这时,需要根据Survival From区的对象年龄大小来确定该区中对象的去向,看其年龄是否达到设定的指定阈值。如果达到指定阈值,会被分配到Old Generation,如果没有则会被复制到Survival To区,当熬过这一次GC时,From区的年龄也会加1,具体内存分配图如下所示:
    在这里插入图片描述

  • 紧接着会把Survival To区的对象,复制到Survival From中去。这时候Eden和Survival区中的内存就空余出来了,供后续新创建的对象来存储,经过第二次GC后的内存分配图:
    在这里插入图片描述

  • GC会一直重复这样的过程,有的对象会进入到老年区,有的则会游离在To和From之间,游离在两者之间的对象可能会达到阈值,到达老年代中。当“To”区被填满,这时“To”区被填满之后,会将所有对象移动到年老代中,当老年代空间被用完,就要进行 Full GC了。

  • 如果新生代老年代中的内存都满了,就会先触发Minor Gc,再触发Full GC,扫描新生代和老年代中所有不再使用的对象并回收
    Full GC当老年代内存不足,即老年代的垃圾回收。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值