我们知道,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空间,所以采用了这种思路。
jvm新生代为什么需要2个Survivor
最新推荐文章于 2024-05-26 12:14:21 发布