如果只使用一块 Survivor 区:
当发生一次 Minor GC 时,回收 Eden 区的垃圾,把存活的对象复制到 Survivor 区,如下图:
ok,目前看起来并没有什么区别。但是当发生第二次 Minor GC 时,问题就出现了。我们来看一下,第二次 Minor GC 时发生了什么:
如果此时发生 Minor GC:
会出现这种情况:
很明显,这样会出现内存碎片化,这样会严重影响到性能。而且 Survivor 区得不到充分利用,很快就会被填满,而使对象存入老年代,这样会使 Full GC 发生的更加频繁,进而影响性能。
使用两块 Survivor 区:
此时发生 Minor GC:
然后,重点来了。复制完成后,交换 Survivor0 与 Survivor1:
程序继续运行至下图情况时:
此时再次发生 Minor GC 时,会发生如下情况:
复制完成后,再次交换 Survivor0 与 Survivor1:
由此看出,这样一来就保证了内存不会出现碎片化,能被充分利用。
参考文章:https://blog.csdn.net/antony9118/article/details/51425581