年轻代为什么有to survivor和from survivor
Survivor的存在意义: 就是减少被送到老年代的对象,进而减少Full GC的发生, Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代
缘由:设置两个Survivor区最大的好处就是解决了碎片化
【碎片化带来的风险是极大的,严重影响JAVA程序的性能。 堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间 】
我们把 Eden : From Survivor : To Survivor 空间大小设成 8 : 1 : 1 ,对象总是在 Eden 区出生, From Survivor 保存当前的幸存对象, To Survivor 为空。一次 gc 发生后:
1)Eden 区活着的对象 + From Survivor 存储的对象被复制到 To Survivor ;
2)清空 Eden 和 From Survivor ;
3)颠倒 From Survivor 和 To Survivor 的逻辑关系: From 变 To , To 变 From 。
年轻代为什么要用复制算法
1、因为复制gc只需要把“活”的对象拷贝到survivor
2、复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法 标记清除:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象。
3、每次都是对其中的一块进行内存回收,没存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。