垃圾回收算法和收集器

算法

引用计数(reference counting)

古老的算法。此对象有一个引用,增加一个计数,删除一个引用减少一个引用。垃圾回收时,只用收集为0的对象。
致命问题是无法解决循环引用的问题。

复制(copying)

eg:survivor from to
此算法将内存空间分为两份。每次使用其中一个区域。(占用空间)
垃圾回收时,遍历当前使用的区域,把正在使用中的对象复制到另一个区域中。

标记清楚(Mark-Sweep)

执行分为两阶段。
第一阶段:从对象根节点开始标记所有被引用的对象。
第二阶段:遍历整个堆,把未标记的对象清除,此算法需要暂停整个应用(Stop the world)。
同时会产生内存碎片。
缺点:
1)未使用的内存空间不连续,浪费。
2)暂停整个应用。

标记整理(Mark-Compact)

执行分为两阶段。
第一阶段:从对象根节点开始标记所有被引用的对象。
第二阶段:遍历整个堆,把未标记的对象清除,同时把存活的对象压缩到一块,顺序排放,避免碎片问题。
避免了复制算法的空间问题。