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

  • 面试官: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 回复 分享
发布于 04-17 17:08 山东
666
点赞 回复 分享
发布于 04-20 21:48 广东

相关推荐

自我介绍Redis + Token 确保幂等性? 过期怎么处理线程池+ CompletableFuture 进行异步任务编排是怎么去搭配使用的线程池7大参数什么场景下用到核心线程数, 什么场景下用到最大线程数 如果超出最大线程数会怎么样(拒绝策略)结合线程池优化处理过程。接口响应速度提升40%这个提升怎么计算的除了线程池外, 还知道其他的线程安全的类吗对你简单说一下的锁升级的过程在偏向锁这个状态的时候, 它的hash值怎么存储的可见性和有序性是怎么实现的AQS原理简单说一下i++操作的时候是怎么保证原子性的CAS操作是怎么保证原子性的单例模式为什么会用到Volatile类的一个加载过程双亲委派模型简单说一下你知道的年轻代和老年代用到的垃圾回收器G1和ZGC的区别如果让你做JVM调优你该从哪些方面入手如果有大对象回收不了该怎么分析两个线程如何交替打印字符和数字wait 和notify如果要用AQS的子类实现呢?Semaphore和ConditionTCP/IP协议3次握手4次挥手的过程发送数据该怎么知道我从哪里开始发送数据, 他这个序列号是怎么产生的Mysql的MVCC里面undolog作用是什么 快照读和当前读 怎么和他们配合的谈谈对Spring的理解怎么实现对一个接口前后的日志记录Spring Boot自动装配原理循环依赖是怎么解决的其实二级缓存就可以解决了, 为什么要用三级缓存快排插入排序
查看37道真题和解析
点赞 评论 收藏
分享
5 12 评论
分享
牛客网
牛客企业服务