一、提出问题
如题,为什么HotspotJVM垃圾回收中的“标记-复制”算法需要两个survivor空间?为什么要强调Hotspot JVM呢,因为JVM有很多种,每种JVM的实现方式都不一样。本文提到的JVM,一律是代表Hotspot JVM。
二、背景
熟悉jvm的童鞋,都应该了解到,一些经典的新生代垃圾收集器运用了“标记-复制算法”,并且,为了较好的实现复制算法,通常把新生代分为两种逻辑分区,一种叫eden空间,另一种叫survivor空间。jvm给一个对象分配内存时,会优先分配到eden空间;然后survivor,顾名思义就是从eden空间经历过Minor GC但仍“得以生存”的那些对象存储的内存空间。
那按照jvm实现的思路,为什么需要两个survivor空间呢?
这个问题用反证法比较好理解,我们作以下几个假设。
三、假设
这里设置新生代被分配的内存空间是10,作以下假设:
- 假设没有survivor空间,eden空间和survivor空间大小比是10:0。 这个假设有点不攻自破,因为既然是复制算法,肯定是至少有一个原来的内存空间,以及一个要复制到的目标空间,所以内存只有一个逻辑分区(这里指eden空间)是不够的,至少要两个逻辑分区