标记清除算法
- 将JVM中没有被GC ROOT引用的对象标记
- 将没有被标记的对象占用的空间进行释放
- 把对象所占用内存的起始结束地址,放入空闲列表中
速度快,只需要将垃圾对象的内存起始结束地址记录即可,但容易产生内存碎片,清除之后不会再会进一步对内存碎片进行整理了,如果有很多的内存碎片,此时我想插入一个比较大的对象,明明此时我们的内存是充足的,但是地址却不是连续的,这个对象就无法存储了。
标记整理算法
- 将JVM中没有被GC ROOT引用的对象标记
- 将对象删除的同时,将未被删除的对象向前移动进行整理
没有内存碎片,但因为整理牵扯到了对象的移动(如果移动的对象被其他对象所引用,也要改动那个对象的引用地址),速度较慢
复制算法
- 首先进行一次标记
- From区域中存活的对象复制到To区,复制完成后,将From区的剩余对象全部删除,并将To区的名字和From区做交换,To区用于不存放对象
不会产生内存碎片,但是会占用双倍的内存空间。