【面试官】你说说都有哪些垃圾回收器

  • 面试官:JVM为什么不采用引用计数法?
  • 面试官:那你讲讲可达性分析算法?
  • 面试官:垃圾回收器回收的是哪个区域?
  • 面试官:那永久代不会进行垃圾回收对吧?
  • 面试官:你说说都有哪些垃圾回收器?
  • 面试官:你说的CMS为什么有较短的停顿?
  • 面试官:那它有什么缺点?
  • 面试官:你说G1是CMS的升级版,为什么?
  • 面试官:垃圾回收算法都有什么?
  • 面试官:复制算法可以怎么优化吗?
  • 👉以【面试官面试】形式覆盖Java程序员所需掌握的Java核心知识、面试重点
  • 📚本期是《JVM系列》,其他系列博客请订阅专栏《Java Offer训练营》
  • ❤创作不易,不妨点赞、收藏、关注支持一下

文章目录

  1. 判断可回收对象
    1. 引用计数法
    2. 可达性分析算法
  2. 垃圾回收器
    1. 垃圾回收区域
    2. 回收永久代
    3. 垃圾回收器
    4. CMS原理
    5. CMS的缺点
    6. G垃圾回收器
  3. 垃圾回收算法
    1. 优化复制算法

1. 判断可回收对象

1.1 引用计数法

面试官:JVM为什么不采用引用计数法?

每个Java对象在引用计数法里都有一个引用计数器,引用失效则计数器 - 1,有新的引用则计数器 + 1,通过计数器的数值来判断该对象是否是可回收对象。

大家看下这个例子,如果对象A和对象B没有被任何对象引用,也没有被任何线程访问,这两个对象按理应该被回收。但如果对象A的成员变量引用了对象B,对象B的成员变量引用了对象A,它们的引用计数器数值都不为0,通过引用计数法并不能将其视为垃圾对象。

    class A {
        B b = new B();
    }
    class B {
        A a = new A();
    }

就因为引用计数法很难解决对象之间相互循环引用的问题,所以目前JVM采用可达性分析算法来判断Java对象是否是可回收对象。

1.2 可达性分析算法

面试官:那你讲讲可达性分析算法?

可达性分析顾名思义就是以某个起始点来判断它是否可达,这个起始点称为GC Roots。如果Java对象不能从GC Roots作为起始点往下搜索到,那该对象就被视为垃圾对象,即可回收对象。

可以作为GC Roots对象一共包括以下四种,这点也是面试官常问的:

  1. 虚拟机栈中引用的对象。
  2. 本地方法栈中引用的对象。
  3. 方法区中类静态属性引用的对象。
  4. 方法区中常量引用的对象。

2. 垃圾回收器

2.1 垃圾回收区域

面试官:垃圾回收器回收的是哪个区域?

JVM由五大区域组成:堆内存、方法区、程序计数器、虚拟机栈、本地方法栈。先说结论,垃圾回收器回收的是堆内存和方法区两大区域。

程序计数器、虚拟机栈、本地方法栈的内存分配和回收都具备确定性,都是随着线程销毁而销毁,因此不需要进行回收

但在堆内存、方法区中,内存分配和回收都是动态的,我们只有在运行期间才能知道会创建哪些对象;另外这些垃圾对象不会自动销毁,如果任由这两部分区域的垃圾对象不管,势必造成内存的浪费甚至有内存泄漏的可能。

垃圾回收器存在的意义就是通过自动检测和回收这些垃圾对象,来减少内存泄漏的风险。

2.2 回收永久代

面试官:那永久代不会进行垃圾回收对吧?

虽然永久代的垃圾回收效率是比较低的,但永久代里的废弃常量和无用的类仍然会被回收。

例如创建一个字符串常量name,该字符串会存在于常量池中。如果该字符串没有任何String对象去引用它,当发生内存回收时有必要会清除该废弃常量。

private static final String name = "JavaGe

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java Offer训练营 文章被收录于专栏

👉以贴近现实的【面试官面试】形式帮助你系统学习后端技术 👉成体系知识帮你在后端进阶,每一道问答助你怒怼大厂面试官,收获大厂offer 👉《Java Offer训练营》包含Redis系列、MySQL系列、Kafka系列、ZooKeeper系列、JVM系列、多线程系列等等 👉制作不易,各位的支持是我创作的最大动力

全部评论
对象从老年代区域消失的过程,我们称之为 "major GC" Full GC 是清理整个堆空间—包括年轻代和永久代
2
送花
回复
分享
发布于 04-17 17:08 山东
666
点赞
送花
回复
分享
发布于 04-20 21:48 广东
滴滴
校招火热招聘中
官网直投

相关推荐

4 7 评论
分享
牛客网
牛客企业服务