2. 垃圾回收算法

2.1. 标记-清除算法(Mark-Sweep)

分两步:

  • 标记
  • 清除

image.png
所谓的清除就是把垃圾释放,这里可能造成一个小的误区,释放是不是意味着把整个内存,每个字节进行一次清零操作呢?
注意:不会,只需要把垃圾占用内存的起始、结束的地址记录下来,放在一个空闲的地址列表里就可以了,下次在分配新对象的时候,就到空闲地址列表中去找,看有没有一块足够的地址空间,来容纳我的新对象,如果有那么久进行内存分配。
标记-清除算法的优缺点:

  • 优点:**速度快**
  • 缺点:造成空间不连续,**容易产生内存碎片**

    2.2. 标记-整理算法(Mark-Compact)

    image.png
    标记-整理算法优缺点:

  • 优点:**没有内存碎片**,连续的空间更多了

  • 缺点:由于整理牵扯到了对象的移动,如果有一些局部变量的引用引用了要整理的对象,肯定需要改变引用的地址,肯定涉及到的工作就多一点,牵扯到区块内存的拷贝、移动,还有所有引用的地址的加以改变,**造成速度较慢。**

    2.3. 标记-复制算法(Semispace Copy【半区复制】)

    image.png
    标记-整理算法的优缺点:

  • 优点:**不会有内存碎片**

  • 缺点:**会占用双倍的内存空间**

这三种算法,实际在JVM的垃圾回收机制中,都会根据不同的情况来采用,不会说只用其中的一种算法,是结合多种算法功能实现垃圾回收的,这也就是所谓的分代垃圾回收机制。