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

  • 面试官:JVM为什么不采用引用计数法?
  • 面试官:那你讲讲可达性分析算法?
  • 面试官:垃圾回收器回收的是哪个区域?
  • 面试官:那永久代不会进行垃圾回收对吧?
  • 面试官:你说说都有哪些垃圾回收器?
  • 面试官:你说的CMS为什么有较短的停顿?
  • 面试官:那它有什么缺点?
  • 面试官:你说G1是CMS的升级版,为什么?
  • 面试官:垃圾回收算法都有什么?
  • 面试官:复制算法可以怎么优化吗?

大家好,我是南哥。

一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。

文章目录

  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 = "JavaGetOffer";

2.3 垃圾回收器

面试官:你说说都有哪些垃圾回收器?

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

Java面试突击 文章被收录于专栏

👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!

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

相关推荐

评论
5
12
分享

创作者周榜

更多
牛客网
牛客企业服务