Java虚拟机:GC算法深度解析(二)

  • 来源:
  • 更新日期:2018-05-23

摘要:前面文章提过后续的收集算法是在标记/清除算法的基础上进行改进而来的那也就是说标记/清除算法有它的不足。其实了解了它的原理其缺点也就不难看出了。

 前面文章提过后续的收集算法是在标记/清除算法的基础上进行改进而来的那也就是说标记/清除算法有它的不足。其实了解了它的原理其缺点也就不难看出了。

1、效率问题:标记和清除两个阶段的效率都不高因为这两个阶段都需要遍历内存中的对象很多时候内存中的对象实例数量是非常庞大的,这无疑很耗费时间而且GC时需要停止应用程序这会导致非常差的用户体验。
2-1605301J034Q1.jpg
2、空间问题:标记清除之后会产生大量不连续的内存碎片内存空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存不得不提前触发另一次垃圾回收动作。
既然标记/清除算法有这么多的缺点,那它还有存在的意义:一个算法有缺陷人们肯定会想办法去完善它接下来的两个算法就是在标记/清除算法的基础上完善而来的。
复制算法
为了解决效率问题复制算法出现了,复制算法的原理是:将可用内存按容量划分为大小相等的两块每次使用其中的一块。当这一块的内存用完了就将还存活的对象复制到另一块内存上然后把这一块内存所有的对象一次性清理掉。
复制算法简单高效,优化了标记/清除算法的效率低、内存碎片多的问题但是它的缺点也很明显:
1、将内存缩小为原来的一半浪费了一半的内存空间代价太高;
2、如果对象的存活率很高极端一点的情况假设对象存活率为100%,那么我们需要将所有存活的对象复制一遍耗费的时间代价也是不可忽视的。