讨论多种垃圾回收并比较

什么是垃圾

语法垃圾

不能从根节点达到的对象,即没有人去引用的对象

语义垃圾

不会被使用的对象

收集器类型

直接收集器

引用计数

在每个对象头中存储引用计数,每次对象改变引用时,老引用对象的计数减1,新对象的计数加1,当计数清零时,回收该内存区域.

问题:

跟踪收集器

标记清除

顾名思义,先标记后清除

标记采用广搜或者深搜,标记存活对象,清除阶段时将其清除

使用标记清除算法的编程语言需要在对象头中加入表示对象存活的标记位(Mark Bit),标记位与操作系统的写时复制不兼容,因为即使内存页中的对象没有被修改,垃圾收集器也会修改内存页中对象相邻的标记位导致内存页的复制。我们可以使用位图(Bitmap)标记避免这种情况,表示对象存活的标记与对象分别存储,清理对象时也只需要遍历位图,能够降低清理过程的额外开销

标记压缩

标记压缩(Mark-Compact)也是比较常见的垃圾收集算法,与标记清除算法类似,标记压缩的执行过程可以分成标记压缩两个阶段。该算法在标记阶段也会从根节点遍历对象,查找并标记所有存活的对象;在压缩阶段,我们会将所有存活的对象紧密排列,『挤出』存活对象之间的缝隙