1、复制算法
将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将还存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。这样使得每次都是对其中一块内存进行回收,内存分配时不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
特点:针对存活率低的对象
优点:无内存碎片
缺点:可使用的内存降为原来一半
2、标记-清除算法
最基础的垃圾收集算法,算法分为“标记”和“清除”两个阶段:
- 标记:标记要(保留)存活的对象
- 清除:未被标记的对象
有两个缺点:
- 有两次扫描的,耗时严重;
- 需要暂停整个应用,会产生内存碎片
适于于 老年代
3、标记整理法(标记压缩法)
标记阶段是相同的标记出所有需要回收的对象,在标记完成之后不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,在移动过程中清理掉可回收的对象,这个过程叫做整理。
标记阶段:标记出所有需要回收的对象(即存活的对象);
压缩阶段:让所有存活的对象都向一端移动,在移动过程中清理掉可回收的对象。
优点:
内存被整理后,不会内存碎片。
缺点:
如果对象存活率高,要执行较多的复制操作,效率将会变低。
4、分代收集算法
根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。