为什么JVM分代机制中的新生代要分两个survivor

探讨了JVM中基于分代机制的内存模型,重点解释了为什么需要eden、from、to三个区域,以及8:1:1的空间分配策略如何避免内存浪费并确保新对象的有效分配。

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

背景前提

我们知道在基于分代机制的JVM内存模型中,新生代被分成了eden、from、to三个区,占比8:1:1,from和to完全等价可以互换,平时使用eden+from,GC时将存活对象复制到to区,然后清空eden+from,from与to身份互换。

疑惑问题

为什么要分from+to两个区?只分一个比如只分为eden+from不是也可以吗?GC时将存活对象复制到from然后清空eden不就可以了吗?

最终解答

传统复制算法是使用eden+from两个区,但此时空间分配应为eden=from,因为eden将存活对象复制到from后,接下来应该使用from来进行新对象分配,因为之前存活下来在from里的对象有可能还会死掉的,因此如果from太小就不足够分配新对象。这样会造成一半内存的浪费;如果不用from而是继续使用刚清空后的eden,那from里的这些对象就无法被回收了

使用8:1:1的策略后,平时使用8+1,GC时将存活的复制到to区,清空8+1后to和from身份互换,原来的to变成了from,而平时使用的是eden+from,因此剩余存活的对象又回到了eden+from中,其空间也为8+1,足够为新对象分配空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值