美文网首页
垃圾回收算法和垃圾回收器

垃圾回收算法和垃圾回收器

作者: Franck_ | 来源:发表于2020-11-07 20:21 被阅读0次

    前置知识:
    对象的引用类型
    对象可达性分析

    垃圾回收算法

    标记清除算法:
    整体过程

    首先将需要清除的对象全部标记出来, 然后将标记的对象全部清除掉。

    缺点:

    • 1 造成过多内存空间碎片。导致可用内存减少。
    • 2 标记和清理的过程都比较慢,效率不高。

    详细过程:有待补充。

    复制算法:
    整体过程

    将内存平均分成两个部分,先使用第一部分的内存,第一部分的内存满了以后,将存活下来的对象复制到第二部分,整齐排列。然后将第一部分全部清理掉。

    优点:不会留下多少内存碎片空间。

    缺点:
    每次只能用一半的内存。
    需要复制对象到另一半内存,如果遇到大部分对象存活,效率比较低 。

    针对缺点: 不一定要将内存平均分成两部分,可以按照一定的比例划分,例如分成3部分, 8:1:1。

    标记整理算法:

    整体过程:
    和标记清除方法差不多,先将需要回收的对象标记出来,然后将存活的对象左移,所有的存活对象和清除对象分开。 然后将存活边界以外的需要清除的对象进行清理。

    详细过程:

    优点:内存利用率高,整个内存都可以使用。

    缺点:需要标记和移动对象,标记和移动不一定很快。

    垃圾回收器

    新生代回收器:

    Serial :

    单线程收集器,现在服务端基本不用。 进行收集的时候,会将所有的其他线程停止下来,然后使用复制算法进行清除,清除完成后,才会重新启动用户的线程。

    在单个CPU和小内存的情况下,可以采用。 现在几乎不用。

    ParNew :

    Serial收集的多线程版本,停止用户线程后,使用多个线程进行回收,在多CPU的机器上,可以更快的回收垃圾。ParNew注重点的是最短的停顿时间。最快的垃圾回收速度。

    Parallel Scavenge:

    和ParNew收集器差不多,但是这个收集器注重的是系统的总体吞吐量(运行代码时间 / (运行代码时间 + 垃圾回收时间) ),也称为“吞吐量优先收集器”。适合计算型的系统,就是即时响应那么快的系统。 采用的也是复制算法。可以不设置新生代的各分区的比例,由收集器自行判断,找到一个合适的停顿时间或最大吞吐量时间。采用的是复制算法。

    老年代回收器

    CMS:

    Serial Old:

    单线程收集器,Serial 收集器的老年代收集版本。采用标记整理算法。

    Parallel Old:

    Parallel Scavenge 的老年版本。关注吞吐量,采用标记整理算法。

    G1回收器:

    ZGC回收器:
    每次回收TB级别内存,10ms内。
    JDK13可以使用,JDK15成为默认收集器。
    有待扩展。

    垃圾回收器使用经验

    大内存的机器16G, 32G,使用G1
    每次都可以按照内存区域进行小范围的回收,STW时间比较短。

    小内存机器8G,使用ParNew + CMS
    每次回收的内存不大,可能就几百M到几G,速度也很快。注意尽量避免FULL GC 。

    相关文章

      网友评论

          本文标题:垃圾回收算法和垃圾回收器

          本文链接:https://www.haomeiwen.com/subject/feftbktx.html