Survivor区存在的意义
如果新生代只有Eden区,则对象经历一次垃圾回收后就会被送往老年代。这样使得老年代内存更容易占满,从而触发Full GC,最终造成影响程序的执行与响应速度,导致连接超时的不良后果。
因此设计survivor区使得对象只有到达一定岁数才能进入到老年代。
为什么需要两个survivor区
假设只有一个Survivor区,当对新生代进行垃圾回收时,Eden区和Survivor区会同时进行垃圾回收,再存入该Survivor区。此时,可分两种情况:
- Survivor垃圾回收,剩余未回收对象仍在原地址存储。再将Eden区进行垃圾回收,存活对象存入Survivor区可以存放的空间。由于Survivor区回收后会造成很多内存碎片,因此向其中存储时需要考虑内存是否已经被占用,并且如果想存放大对象时会有可能没有足够空间从而触发Full GC。
- Survivor垃圾回收,剩余未回收对象依次从头开始存到本Survivor内存中连续的空间。但是这个操作会需要一直考虑是否想放入的内存没有被占用,如果被占用还需要挪动该对象,算法比较复杂。
-----------------