垃圾收集新生代中为什么需要两个Survivor区
Survivor区存在的意义
如果新生代只有Eden区,则对象经历一次垃圾回收后就会被送往老年代。这样使得老年代内存更容易占满,从而触发Full GC,最终造成影响程序的执行与响应速度,导致连接超时的不良后果。
因此设计survivor区使得对象只有到达一定岁数才能进入到老年代。
为什么需要两个survivor区
假设只有一个Survivor区,当对新生代进行垃圾回收时,Eden区和Survivor区会同时进行垃圾回收,再存入该Survivor区。此时,可分两种情况:
- Survivor垃圾回收,剩余未回收对象仍在原地址存储。再将Eden区进行垃圾回收,存活对象存入Survivor区可以存放的空间。由于Survivor区回收后会造成很多内存碎片,因此向其中存储时需要考虑内存是否已经被占用,并且如果想存放大对象时会有可能没有足够空间从而触发Full GC。
- Survivor垃圾回收,剩余未回收对象依次从头开始存到本Survivor内存中连续的空间。但是这个操作会需要一直考虑是否想放入的内存没有被占用,如果被占用还需要挪动该对象,算法比较复杂。
---------------------------------------------------------图1.只有一个Survivor---------------------------------------------------------------------
因此,如果有两个Survivor区,则可以将Eden区和Survivor区未回收的对象连续的放在一块空白内存区域。从而解决上述问题。
在新生代中, 每次垃圾收集时都发现有大批对象死去, 只有少量存活, 那就选用复制算法, 只需要付出少量存活对象的复制成本就可以完成收集。 而老年代中因为对象存活率高、 没有额外空间对它进行分配担保, 就必须使用 “ 标记 - 清理 ” 或 “ 标记 - 整理 ” 算法来进行回收。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
