【小记】为什么jvm的新生代要分为一个Eden和两个Survivor

本文解释了JVM新生代内存为何被划分为Eden区和两个Survivor区。通过介绍复制算法及其优化过程,说明这种划分如何既减少了内存碎片又提高了内存使用效率。

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

2021-03-12

现在的JVM的新生代内存中,除了Eden区,还有两个Survivor区。那为什么要这样设置呢?
这和新生代的垃圾回收算法是息息相关的。

复制算法

复制算法是新生代的垃圾收集收集算法,基本思路是将新生代分为两个大小一样的内存区域,每次新对象会放置在其中的一块区域内。当该区域的大小不足以继续分配对象时,此时就会促发Minor GC,首先将存活的对象标记出来,然后将存活的对象转移到另一块内存区域中,这样可以比较紧凑地将对象排列在一起,减小了内存碎片。同时之前那块内存可以一次回收掉所有的对象。
复制算法主要是减少了内存碎片
但是每次只能用一半的新生代,对内存的使用效率太低了!

复制算法的优化:Eden区和Survivor区

其实大多数对象存活周期非常短的,可能一次新生代垃圾回收,99%的对象都被回收了,所以真正的复制算法会进行优化,把新生代内存分为三块:一块Eden区和两块Survivor区。比例可以是8:1:1
平时对象的分配都是分配在Eden区,当Eden区快满时触发垃圾回收,将存活的对象转移到其中一块Survivor区中,然后对Eden区进行清除。等到Eden区再次填满时,Eden区域的存活对象和使用过的Survivor区域的存活对象转移到空的Survivor区域中,然后清除Eden区和之前的Survivor区。就这样始终保存一块Survivor是空的等待接受存活对象,循环使用三块内存。这样可用内存就变成了90%,而不是之前的50%
这也就是为什么新生代要划分为三块区域,这样做既能减少内存碎片,也能提高内存的使用效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值