全文内容
垃圾收集器算法有三种:
- 标记-清除算法: 标记堆上垃圾, 并清除垃圾
- 标记-复制算法: 标记堆上存活对象, 并复制到另一块内存中
- 标记-整理算法: 标记对上存活对象, 将其依次移动规整为一个整体, 防止出现内存碎片
三者的优点和缺点
标记-清除算法
它会扫描整个堆, 标记垃圾, 最后清理掉这些垃圾
优点
gc时间对比另外两种算法来说最快
缺点
内存没做整理, 到处都是碎片化的内存, 导致分配较大对象时碎片化的内存可能无法被使用, 需要再找个可以存储该对象的内存块
这会导致程序吞吐量变低, 因为 执行 gc 的频率较少, 但是 new 对象 分配内存的频率较高
使用场景
垃圾收集器较小的情况下可以使用该垃圾收集算法, 但是我觉得也不太行
内存碎片不整理, 迟早会出事
CMS 就是基于 标记清除算法, 但是它也添加了看内存碎片程度是否执行整理的功能
标记-复制算法
标记堆上存活对象, 并复制到另一块内存中
优点
标记复制算法,的优点在于复制之后的内存是完整的,不是碎片化的
缺点
缺点有这几点 第一点内存的占用比较大,第2点呢,如果线程的对象较多的话,那么复制到内存块二中的时间就会较长,导致整体GC的时间变长,而且还有第3个缺点,就是如果内存块一中的对象较大较多无法复制的内存块2,就需要一个担保机制,另外存放到老年代的内存中,这里有三点缺点
使用场景
标记复制算法合适,内存块1中幸存的对象较少,并且内存较为充裕的情况下才可以使用
标记整理算法
它会标记堆中幸存的对象将其依次移动整理
优点
不会产生内存碎片的问题
缺点
整理的过程需要消耗很大的时间和CPU的计算资源
为了防止对象移动过程中出现一些错误,就需要stop the world
使用场景
CMS. 基于标记清除算法,但是在适当的时候,他也会执行一次标记整理算法,但这需要看内存空间碎片化的程度,是否大到已经影响到对大对象的分配
部分图片来源于网络, 侵删