新生代的作用和survivor区的作用
区域简图
在了解新生代的作用和新生代中 survivor 区的作用之前,我们先了解为什么会有新生代以及为什么会有 survivor 区
新生代的作用和survivor区的作用
为什么会有新生代
新生代主要是存放新创建的对象,新对象的生命周期一般也就会随着方法的执行完毕而终结。GC的时候会优先清理新生代,这样更容易清理出很大的空间来,没有很大的对象,存活对象较少。
存在新生代的原因主要是:减少老年代的Full GC频率和存放新创建的对象方便清理
为什么会有 survivor 区
我们把新生代中的 eden 区,survivor区和老年代看做 板凳队,预备队和主力队
所有小萌新都会先去到板凳队,一些重量级的大佬就会直接到主力队,我们也知道主力队的人数是有限的,所以不能让你直接从板凳队晋升到主力队,所以你得在预备队经过考验才可以,而 survivor 担任的就是预备队的角色
转换一下:
新生代中的对象最终的归宿要么被清理,要么进入老年代,我们知道老年代的内存空间有限,进行一次Full Gc 要消耗很多时间,所以为了减少老年代发生 Gc的频率,我们要让新生代的对象在survivor区中经过一定次数的Minor Gc 才能有资格进入到老年代,经受不住这个考验的就直接在新生代被淘汰掉了
survivor 区起到了一个承接的过程,保证存活的对象不会直接进入到老年代
不使用 survivor 区的解决办法
方案 | 优点 | 缺点 |
---|---|---|
增加老年代空间 | 降低Full GC频率 | 一次Full GC执行需要时间更长 |
减少老年代空间 | Full GC所需时间减少 | Full GC频率增加 |
新生代使用的回收算法
因为新生代的对象生命周期都很短,能够存活下来的对象很少,并且对象占的的内存也比较小,所以使用复制算法。
复制算法的思想
就是将内存分为两块,每次使用其中一块,一块内存使用完了之后就会将存活的对象复制到另一块内存中。所以复制算法不会产生碎片
复制算法的工作流程
- 当开始GC的时候对象只会存在于eden 和 From-Survivor 区
- GC过程中会把 eden 中存活的对象复制到 To-Survivor 区,From-Survivor 区会根据年龄来决定对象是否去老年代
- From和To的角色交换
- 如果To区填满了,会将所有的对象移动到老年代
设置两个Survivor区的作用
设置两个Survivor区的最大作用是为了防止碎片化
当只有一个survivor区的时候,每一次清理新生代都会将对象复制到 survivor 区,而 survivor 区也是会经历Minor GC的,这样就会导致部分空间不能够存放一下一个完整的对象,这样就导致了空间的不连贯性,产生碎片化。
两块survivor区的话其中有一块空间始终的空的,可以通过复制算法将新生代和另一块 survivor 区中的对象全部复制过去,这样复制过去的对象是连续的