jvm新生代为什么需要2个Survivor

我们知道,JVM的堆空间是分为新生代和老年代的,其中新生代又包含Eden和Survivor(2个),有没有同学在看到这个的时候好奇,为什么会有2个Survivor空间呢?
首先,我们先来看,为什么需要Survivor ?
我们知道,新生代是由于“朝生夕死”的对象比较多,会采用复制算法来进行垃圾回收,复制算法的逻辑是,把内存空间一分为二(可以理解为Eden和Survivor),只使用其中的一部分(Eden)来进行对象分配,当发生gc时,会把仍然存活的对象复制到另一个区域(Survivor),所以先明白,Survivor的存在是必要的。那为什么是2块呢?还是回到刚才的场景,等到了下一次gc,不仅要回收Eden空间的对象,Survivor空间的对象也是要回收的,那这种情况下怎么处理呢?如果还是像上次一样,直接把Eden存活的对象复制到Survivor,那么Survivor中有一部分对象被回收,造成了可用空间的不连续,就可能会影响新生代内存空间的使用了,导致可能会出现明明可用空间足够,但是大对象在申请连续空间的时候失败,这种情况可以有多种解决思路,包括对Survivor空间进行标记-整理,也可以再分出另外一个空间(to-Survivor),将Eden和Survivor(from-Survivor)的存活对象复制到to-Survivor,切换from-Survivor和to-Survivor的关系,下次gc的时候,重复这个步骤。个人猜测是对Survivor空间进行整理的效率小于使用2个Survivor空间,所以采用了这种思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值