JVM垃圾回收机制

主要从什么时候回收、回收哪些对象、怎么回收三个方面叙述。

参考:

什么时候进行垃圾回收

在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

哪些对象会被回收

  1. 引用计数器法:为每个对象创建一个【引用计数器】,有对象引用时计数器 +1,引用被释放时计数 -1(缺点:循环引用问题)
  2. 可达性分析法:从【 GC Roots 】开始向下搜索,搜索所走过的路径称为【引用链】。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

怎么回收(回收算法)

  1. 标记-清除

    标记可回收对象,然后清除(缺点:使得整块内存碎片化)

  2. 复制算法

    将内存分为相等大小的两份,存活对象复制到另一份,然后清除剩下的部分。

  3. 标记-整理算法

    存活对象移动到一端,剩下的一块清理掉

  4. 分代回收算法

    新生代(存活率低)基本采用复制算法,老年代(存活率高)采用标记-整理或标记-清除算法

    minor GC: 程序刚开始运行的时候,当eden区满了的时候,会发起一次minor GC,将eden区存活对象复制到 from 区,大部分可回收对象则被清除;但from区也会慢慢被填满,因此接下来的minor GC,会将eden和from区存活对象复制到 to 区,然后将 eden和 from区一次清理,这样就保证了to和from区总有一个是空的。

    major GC:清理old区,使用标记-整理算法(将存货对象往一边移动,然后将边界的区域一次性清除)

image

问题:

1、什么是GC roots

GC roots是可达性分析算法中定义的一个根节点,从这个节点开始,引出下一个节点,如果下一个节点还指向有对象,就又引出一个节点,以此类推。这样从GC root对象开始引出的一条线叫引用链,当没有引用链指向的对象,就会被判定为可回收对象

2、哪些对象可以作为 GC root?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
posted @ 2022-04-08 15:40  aJream  阅读(250)  评论(0编辑  收藏  举报