https://cloud.tencent.com/developer/article/1902934
- 为什么要有 Survivor
Survivor 的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生,Survivor 的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
解决内存碎片化的问题
先不去想为什么有两个Survivor区,先设想下Survivor区的意义在哪里?
如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。这样老年代内存很快就被用完,触发Major GC。由于老年代的内存空间远大于新生代,所以进行一次 Full GC 消耗的时间比Minor GC长得多,这样就会导致系统执行缓慢卡顿,响应速度过慢,用户体验十分不好,更不要说某些连接会因为超时发生连接错误了。
那我们来想想在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:
显而易见,没有 Survivor 的话,上述两种解决方案都不能从根本上解决问题。
所以可以得到第一条结论:Survivor的存在意义,就是减少被送到老年代的对象,进而减少 Full GC 的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。