• JVM面试题:(三)GC和垃圾回收算法


    GC:

    在这里插入图片描述

    垃圾回收算法:

    GC最基础的算法有三种: 标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般
    都采用分代收集算法。

    标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清
    除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

    复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次
    只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后
    再把已使用过的内存空间一次清理掉。

    标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行
    清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

    分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,
    这样就可以根据各个年代的特点采用最适当的收集算法。

    分代回收:

    在这里插入图片描述
    对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
    大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在

    Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
    长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次

    Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达
    到阀值对象进入老年区。
    动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的
    一半,年龄大于或等于该年龄的对象可以直接进入老年代。
    空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,
    如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查

    HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

    垃圾回收器

    在这里插入图片描述
    新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。
    在这里插入图片描述

  • 相关阅读:
    SpringBoot 核心流程
    C语言之字符串函数二
    matlab神经网络预测模型,matlab人工神经网络预测
    Python + Django4 搭建个人博客(十二):实现删除文章功能页面
    Redis数据持久化
    【云原生 | Kubernetes 系列】---Skywalking部署和监控
    NoSuchMethodError的常见原因和通用解决方式
    libusb系列-002-Windows下libusb源码编译
    英语进阶指南:高效学习方法,提升英语水平 | 开源专题 No.35
    软件需求说明书(GB856T-88)
  • 原文地址:https://blog.csdn.net/weixin_42774617/article/details/133778800