新生代Eden区、两个Survivor区及老年代的关系

探讨JVM年轻代中Eden区与Survivor区8:1:1比例的原理,解析年轻代分区如何减轻老年代负担,减少内存碎片,提高GC效率。

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

偶然想起JVM年轻代中Eden区和两个Survivor的比例,就想根据自己的理解和大家探讨一下为什么要配成8 :1 :1的比例。

一、JVM堆分代

1、JVM堆被分为了年轻代和老年代。年轻代的GC过程称为Yong GC,速度快较频繁。老年代的GC过程称为Full GC,速度较慢应该尽量避免。

2、对象被创建后,除了少部分大对象会在老年代分配内存外,大部分的对象首先都是在年轻代进行内存分配,而且大部分的对象都是“朝生夕死”,很快就会被年轻代的Yong GC回收掉。

3、老年代的内存空间一般会比年轻代的内存空间大,能存放的对象多,老年代的空间不足后会进行Full GC操作,比Yong GC耗时,所以应尽量避免频繁的Full GC操作。

二、年轻代的分区

1、年轻代中分为一个Eden区和两个Surviver区,比例为8:1:1,两个Surviver区分别称为“From”区和“To”区。对象在Eden区创建,经过一次Yong GC后,还存活的对象将会被复制到Surviver区的“From”区,此时“To”区是空的。到了下一次GC的时候,Eden区还存活的对象会复制到Surviver区的“To”区,而“Form”区的对象有两个去处,“From”区的对象会根据经过的GC次数计算年龄,如果年龄到达了阈值(默认15),则会被移动到老年代中,否则就复制到“To”区,此时“From”区变成了空的,然后“From”区和“To”区进行角色互换,到下一次进行GC时,还是有一块空的“To”区,用来存放从eden区和“From”区移动过来的对象。

2、那这种分区有什么好处呢?

a、在年轻代新增Surviver区,有利于减轻老年代的负担,尽可能的让大部分对象在年轻代通过较高效的Yong GC回收掉,不至于老年代里存放的对象过多导致内存不足而进行频繁的Full GC操作。

b、这种分区有利于减少内存碎片的产生。

首先我们来看看,如果年轻代只分为Eden区和Surviver区两个区域并且比例是8:2的时候,内存的回收和分配情况会怎么样。第一次Yong GC后,Eden区还存活的对象移动到Surviver区,Surviver区还存活的对象保留在Surviver区,而这些对象的内存是不连续的,Surviver区里就会产生很多内存碎片,这就会导致有些大对象要移动到Surviver区的时候,没有足够的连续内存进行分配,而不得不移动到老年代中,增加老年代的负担,降低效率。

然后我们看看Eden区和Surviver区的比例是8:1:1时会有什么样的效果。第一次Yong GC后,Eden区还存活的对象复制到Surviver区的“To”区,“From”区还存活的对象也复制到“To”区,再清空Eden区和From区,这样就等于“From”区完全是空的了,而“To”区也不会有内存碎片产生,等到第二次Yong GC时,“From”区和“To”区角色互换,很好的解决了内存碎片的问题。

如下图所示:

有人要说为什么一定是8:1:1的比例呢,这大概是前辈们实践出来的最佳比例吧~~

 

在Java虚拟机(JVM)中,新生代(Young Generation)是用来存放新创建对象的域,它包括一个Eden两个Survivor(通常称为S0和S1)。理解这些域的工作原理对于优化应用程序性能和准备面试都是十分重要的。 参考资源链接:[Java面试必备:JVM内存垃圾回收深度解析](https://wenku.youkuaiyun.com/doc/b18dt45q4f?spm=1055.2569.3001.10343) 首先,Eden是大多数新对象首先被创建的地方,当Eden不足以存放新对象时,就会触发一次称为Minor GC(次要垃圾回收)的事件。Minor GC的主要任务是清除不再被引用的对象,以腾出空间给新对象。在进行Minor GC时,存活的对象首先会被移动到一个Survivor(通常是S0),而另一Survivor(S1)则保持空闲。随着应用程序的运行,Eden的对象会不断被复制到Survivor,直至Survivor无法容纳时,仍然存活的对象会被提升(promote)到老年(Old Generation)。 Survivor的作用是为了保存Minor GC后存活的对象,并为这些对象提供足够的存活空间。这样可以保证老年空间不会因为频繁的垃圾回收而过早地被使用。在Minor GC过程中,一般情况下,一个Survivor作为to域,另一个作为from域。当Eden进行垃圾回收时,存活的对象会被复制到to域的Survivor中。随着垃圾回收的进行,两个Survivor会进行角色交换,之前to域的Survivor在下一次Minor GC时将作为from域。 这种新生代的设计对于垃圾回收策略的影响体现在两个方面: 1. **分假说**:根据观察,大多数对象很快就不再被引用,而存活下来的对象会存活更久。因此,新生代EdenSurvivor的设计符合这种假说,使得垃圾回收器能高效地回收大部分对象,只有少数对象会被移动到老年。 2. **分收集**:由于对象的这种分配和生存特性,JVM采用了分收集算法。这种算法通过不同的垃圾回收策略,针对新生代使用如复制算法来快速处理新创建的对象,而对老年则使用标记-清除或标记-整理算法来处理长时间存活的对象。 了解EdenSurvivor如何协同工作,以及它们如何影响垃圾回收策略,能够帮助开发者更加有效地监控和调整JVM的内存管理,从而提升应用程序的性能。在准备面试时,这些知识也会帮助面试者展示对JVM的深刻理解。 如果你希望更深入地了解JVM内存管理及垃圾回收的各个方面,请务必查阅这份资料:《Java面试必备:JVM内存垃圾回收深度解析》。这份资源不仅涵盖了新生代老年的设计原理,还详细解析了各种垃圾回收器的工作机制,以及如何针对不同选择合适的垃圾回收算法,是Java开发者在面试前不可或缺的复习资料。 参考资源链接:[Java面试必备:JVM内存垃圾回收深度解析](https://wenku.youkuaiyun.com/doc/b18dt45q4f?spm=1055.2569.3001.10343)
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值