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

背景前提

我们知道在基于分代机制的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,足够为新对象分配空间

发布了98 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Mutou_ren/article/details/103774102