Scavenge算法 #
每次回收中能存活下来的对象占总体的比例都比较小。那么,我们就可以结合这个特点,把 To 空间设置得小一点,来提升空间的利用率。
Hotspot 在实现 copy 算法时做了一些改进。它将 From 空间称为 Eden 空间,
To 空间在算法实现中则被分成 S0 和 S1 两部分,这样 To 空间的浪费就可以减少了。Java 堆的空间关系如下图所示:
在这张图里,Hotspot 的内存管理器在 Eden 空间中分配新的对象,每次 GC 时,如果将 S0 做为 To 空间,则 S1 与 Eden 合起来成为 From 空间。也就是说
To 空间这个空闲区域就大大减小了,这样可以提升空间的总体利用率。
Scavenge 算法是简单 copy 算法的一种改进。在这种算法中,人们习惯于把 S0 和 S1 称为幸存者空间(Survivor Space)。配置 Survivor 空间的大小是 JVM GC 中的重要参数,例如:-XX:SurvivorRatio=8,代表 Eden:S0:S1=8:1:1。