1 垃圾回收算法

  1. 标记算法

    介绍

    该算法分成两步完成:

    1. java程序运行过程中,当有些对应没有被gc root所引用时,那么该对象就会被标记。
    2. 当标记完之后,那些被标记的对应,就会被清除掉,也就是释放内存。释放之后,会那段内存的起始位置加入到内存的空内存地址库。当再有新对象被创建时,首先会查找地址库中的内存块是否有符合条件(内存大小是否够用)的,如果有,就将其分配给新对象,否则就另外开辟一段。
  • 优点:

    • 清理速度很快

      只需要将被标记的对象的起始地址记录下来,就可以完成清理工作,所以速度很快

  • 缺点:

    • 容易产生内存碎片

      从上图中可以看到,由于很多被释放掉的对象都是穿插着的,所以很难有一块完整的空内存,有时候总的空内存是足够分配给一块新的需要大内存的对象的,但是由于非常零碎,所以没办法利用。

  1. 标记整理

    标记整理

    该算法还是分两步:

    1. 首先第一步和标记算法一样,都是先给没有被gc root引用的对象进行标记
    2. 这一步,该算法做了一个整理的操作:也就是将一些还在被gc root引用的对象向前移动,这里的移动包括数据,以及一些引用的地址,都需要做修改,所以这一步需要消耗一定的时间。相对于标记算法而言,速度较慢
    • 优点:

      • 能够有效利用被释放的空间,相对于标记算法,不会再产生内存碎片了
    • 缺点:

      • 速度没有标记算法快,较慢
  2. 复制

    复制算法

    该算法有两个区域,一个是FROM区域,另一个是TO区域,该算法执行分成三步:

    1. 先标记处没有被gc root引用的对象

    2. 然后将FROM被标记的对象释放掉,在将没有被释放掉的对象复制一份到TO区域中

      复制完成之后:

      复制完成之后

    3. 然后在交换FROMTO的位置,这样TO就又变成了一个空的内存空间

      交换完以后:

      交换完之后

    • 优点:
      • 不会产生内存碎片
    • 缺点:
      • 需要占用两块内存空间,所需要的内存空间较大

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号