初识JVM——GC算法

    科技2022-07-15  134

    引用计数法

    给每个已占空间都设置上一个引用计数器,当指向这块空间的引用数为0时,便清理这块儿空间。

    这个方法实现起来比较简单,但问题较多。

    因为计数器本身就有较大的资源消耗,很多场景都不适用。

    复制算法

    给新生代再次划分,分为 伊甸区(Eden)和 两个幸存区(from 和 to)。

    此方法运行时效性好,比较快。但:

    两个幸存区中 一定有一个是空的,这样就相当于浪费了一部分空间。

    标志-清除-压缩

    过程如图: 标志 和 清除可以很好的利用空间,但这样会产生较多的空间碎片,降低了空间的利用率。

    所以,又加了一步 压缩。

    这三个过程下来 还是比较浪费时间的。但的确解决了空间利用的问题。(又是用时间去换空间。)


    到底有没有最佳方法呢?

    还是那句话,没有最好 只有 最适合。

    据统计发现,99%的对象会在 新生代 死亡,所以我们可以在这里使用 复制算法。 而老年区 不太容易被淘汰,所以我们用 标志-清除,清除几次之后,发现碎片较多了,我们可以走一次压缩。

    这样我们的GC就体面多了。

    Processed: 0.012, SQL: 8