https://cloud.tencent.com/developer/article/1902934

  1. 为什么要有 Survivor

Survivor 的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生,Survivor 的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。

  1. 为什么要设置两个 Survivor

解决内存碎片化的问题

1 、Survivor存在的意义

先不去想为什么有两个Survivor区,先设想下Survivor区的意义在哪里?

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。这样老年代内存很快就被用完,触发Major GC。由于老年代的内存空间远大于新生代,所以进行一次 Full GC 消耗的时间比Minor GC长得多,这样就会导致系统执行缓慢卡顿,响应速度过慢,用户体验十分不好,更不要说某些连接会因为超时发生连接错误了。

那我们来想想在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:

显而易见,没有 Survivor 的话,上述两种解决方案都不能从根本上解决问题。

所以可以得到第一条结论:Survivor的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。

2 、为什么要设置两个Survivor