JVM--分代垃圾回收机制

本文深入解析了JVM的垃圾回收机制,包括新生代与老年代的区域分布、垃圾回收触发条件及算法,如复制算法、标记清除算法等。详细介绍了对象从新生代到老年代的晋升过程,以及各种垃圾回收器的工作原理。

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

新生代的区域分布

在这里插入图片描述新生代的分布图如上

新生代垃圾回收机制

当伊甸园的内存不足时,如果此时再放入新的对象,则发现内存不够,会导致新生代发生一次垃圾回收,(此时进行的垃圾回收我们记为Minor GC) 此时执行的垃圾回收算法为复制算法。会将GC Root上的对象存入到幸存区(To),同时会将对象的寿命加1,由于采用的是复制算法,因此会将幸存区(To)与幸存区(From)交换地址。 若在此之后进行第二次的垃圾回收,在检查伊甸园的对象的同时,垃圾回收也会检查幸存区内的对象,然后与第一次所采用的机制相同,若幸存区的对象仍然存活,则寿命再次加一,若不存活,则会导致被垃圾回收,不管寿命为多少

老年代的垃圾回收机制

老年代相对于新年代来说,其比较简单。我们可以将老年代设想为我们想扔掉一些垃圾,但是每次我们都想在下一次把它扔掉。新生代的垃圾就像我们日常产生的垃圾,如每次吃饭后的饭盒,喝过的饮料瓶。老年代的垃圾就是新生代中产生的那些不舍得扔掉的垃圾,如家里坏掉的电脑,板凳等,只有当家里实在放不下的时候,我们才会考虑扔掉它们。 老年代的垃圾是那些新生代中的幸存区寿命大于一定阈值的对象,我们会将其从新生代转移到老年代。

要点总结

对象首先分配到伊甸园区 新生代空间不足时,触发minor gc(采用的是垃圾回收的复制算法,存活的对象年龄加一,并且交换from to) minor gc会引发一次 stop the world(会暂停其他用户的线程,只运行垃圾回收线程。因为垃圾回收牵扯到了地址的复制,若其他线程仍然在运行,会造成混乱,垃圾回收结束,用户线程才恢复运行) 当对象寿命超过阈值时,会晋升到老年代,最大寿命为15(4bit 转换为10进制为15)(不同的垃圾回收器最大寿命不同) 当老年代空间不足时,会先执行minor gc,若之后空间仍然不足,会触发full gc,STW时间更差(采用的是标记清除算法 或者标记整理算法)若full gc之后老年代的空间仍然不足,则会发生OutOfMemoryError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值