GC垃圾回收算法
新生代:复制算法
一共有三个区域,伊甸园区还有两个幸存者区,每当伊甸园区疯狂new对象满了之后,就会进行垃圾回收,然后有一些幸存下来的对象就会放到一个幸存区中,幸存区有对象的时候就被称为(From)没有对象的成为TO;当伊甸园区跟from区内存到达临界点之后就优惠进行垃圾回收,产生的幸存对象就会复制到to区去,就变成了From区了,之前的form就变成了to区;一直重复,如果to区被填满之后就会放到老年代区了
优点:不会产生内存碎片。
缺点:
1)会开辟新的空间也就是 To survivor,用来保存有用对象
2)复制对象会花费一些时间
老年代:标记清除算法、标记整理算法
标记清除算法
首先会标记出要被回收的对象,然后统一回收所有被标记的对象
缺点:
1、标记阶段和清除阶段的效率都不高。
2、显而易见的,清除后产生了大量不连续的内存碎片,导致在程序运行过程中需要分配较大对象的时候,
无法找到足够的连续内存而不得不提前触发一次垃圾收集动作。
标记整理算法
标记过程和标记清除的过程是一样的,就是整理过程不一样,整理过程不是直接对可回收对象进行回收,而是将幸存的对象和被标记的对象向两端移动,最后在统一清除被标记的对象
优点;自带整理效果,不会产生大量不连续的空间,适合老年代的大对象存储;
三种算法的比较
内存效率:复制算法>标记清除算法>标记整理算法
内存整齐度:复制算法=标记整理算法>标记清除算法
内存利用率:标记整理算法=标记清除算法>复制算法
分代收集
- 在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量的存货,这就可以使用复制算法只需要付出少量存活对象的复制成本就可以完成收集
- 老年代中因为对象存活了率高、没有额外空间对它进行分配,就必须使用标记清除或者标记整理算法。