JVM:垃圾收集算法
标记清除算法
标记和清除两个阶段,首先标记出所有要回收的对象,在标记完后同一回收所有被标记的对象
缺点:
1)效率问题:低
2)空间问题:标记清除后会产生大量不连续的问题。空间碎片太多会导致以后再程序运行过程中需要分配大对象时,无法找到足够的连续内存而不得不发出另一次垃圾收集动作
复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,将存活的对象复制到另一块,然后把已用的内存一次清理掉。内存分配时只要制动堆顶指针,按顺序分配即可,实现简单,运行高效
缺点:内存缩小为原来的一半
标记整理算法
根据老年代的特点,标记过程和标记清除一样,但整理过程是让所有存活对象都向一端移动,然后直接清理掉边界以外的内存
分代收集算法
思想:根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法
老年代存活率较高,没有额外的空间对它进行分配担保,就必须用标记-清除和标记-整理算法进行回收