1、标记-清除算法
算法:第一步标记需要被清除的对象,第二步回收已标注的对象空间
问题:标记步骤、清除步骤算法效率并不高。清除后的空间不连续,碎片比较多,对后期分配大空间的对象造成问题。
2、复制算法
算法:将内存区域划分成大小相等两部分,当内存将用完了就进行复制,将依旧有用的对象复制到没有使用的块上连续存放。然后一次性清理掉已使用部分的空间。实现简单,运行高效。
问题:内存只能使用实际大小的一半,空间浪费严重。
改进方式:因为大多数的对象创建后很快就会被回收,所以空闲的区域就无需一半那么大。根据统计有了:8:1:1的一个内存模型
新生代每次使用90%的空间,需要回收时将8+1部分的移入空白的1部分。但是并不能保证每次最多只有10%存活,这就涉及到借用其他内存的情况。
3、分代收集算法
根据对象生存周期的不同,将内存分为几块区域,并且根据不同区域的特定选用不同的收集算法。如新生代对象大量回收,选用复制算法,因为需要复制的对象很少,性能较高。而老年待中的对象存活率高,空间有限,就需要标记-清除。标记-整理算法。
新生代中的未回收对象在经过几次标记后,移入老年代。
4、标记-整理算法
算法:第一步标记需要被清理的对象,第二步,将未清理的对象统一向一侧移动,第三步,将后续需要清理的空间统一清理,类似复制算法的清理。