引用计数法
给每个已占空间都设置上一个引用计数器,当指向这块空间的引用数为0时,便清理这块儿空间。
这个方法实现起来比较简单,但问题较多。
因为计数器本身就有较大的资源消耗,很多场景都不适用。
复制算法
给新生代再次划分,分为 伊甸区(Eden)和 两个幸存区(from 和 to)。
此方法运行时效性好,比较快。但:
两个幸存区中 一定有一个是空的,这样就相当于浪费了一部分空间。
标志-清除-压缩
过程如图: 标志 和 清除可以很好的利用空间,但这样会产生较多的空间碎片,降低了空间的利用率。
所以,又加了一步 压缩。
这三个过程下来 还是比较浪费时间的。但的确解决了空间利用的问题。(又是用时间去换空间。)
到底有没有最佳方法呢?
还是那句话,没有最好 只有 最适合。
据统计发现,99%的对象会在 新生代 死亡,所以我们可以在这里使用 复制算法。 而老年区 不太容易被淘汰,所以我们用 标志-清除,清除几次之后,发现碎片较多了,我们可以走一次压缩。
这样我们的GC就体面多了。