一、提出问题
如题,为什么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空间)是不够的,至少要两个逻辑分区,才能实现“得救者”的转移。
- 假设只有一个survivor,eden空间和survivor空间大小比是5:5。 这样一来,把新生代内存分成两个空间,eden和surivor各占一半。我们可以想象一下,jvm会在eden空间为新对象分配内存,然后到MinorGC发生时,eden空间中得以存活的对象被复制并移动到survivor

Hotspot JVM采用标记-复制算法进行垃圾回收时,使用两个Survivor空间是为了避免内存浪费和提高效率。通过8:1:1的比例,确保新生代对象的高效管理,防止因eden和单一survivor空间大小不对等导致的大对象过早晋升到老年代,从而引发FullGC和性能问题。
最低0.47元/天 解锁文章
4770

被折叠的 条评论
为什么被折叠?



