【面试官】你说说都有哪些垃圾回收器
- 面试官:JVM为什么不采用引用计数法?
- 面试官:那你讲讲可达性分析算法?
- 面试官:垃圾回收器回收的是哪个区域?
- 面试官:那永久代不会进行垃圾回收对吧?
- 面试官:你说说都有哪些垃圾回收器?
- 面试官:你说的CMS为什么有较短的停顿?
- 面试官:那它有什么缺点?
- 面试官:你说G1是CMS的升级版,为什么?
- 面试官:垃圾回收算法都有什么?
- 面试官:复制算法可以怎么优化吗?
大家好,我是南哥。
一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。
文章目录
- 判断可回收对象
- 引用计数法
- 可达性分析算法
- 垃圾回收器
- 垃圾回收区域
- 回收永久代
- 垃圾回收器
- CMS原理
- CMS的缺点
- G垃圾回收器
- 垃圾回收算法
- 优化复制算法
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对象一共包括以下四种,这点也是面试官常问的:
- 虚拟机栈中引用的对象。
- 本地方法栈中引用的对象。
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象。
2. 垃圾回收器
2.1 垃圾回收区域
面试官:垃圾回收器回收的是哪个区域?
JVM由五大区域组成:堆内存、方法区、程序计数器、虚拟机栈、本地方法栈。先说结论,垃圾回收器回收的是堆内存和方法区两大区域。
程序计数器、虚拟机栈、本地方法栈的内存分配和回收都具备确定性,都是随着线程销毁而销毁,因此不需要进行回收。
但在堆内存、方法区中,内存分配和回收都是动态的,我们只有在运行期间才能知道会创建哪些对象;另外这些垃圾对象不会自动销毁,如果任由这两部分区域的垃圾对象不管,势必造成内存的浪费甚至有内存泄漏的可能。
垃圾回收器存在的意义就是通过自动检测和回收这些垃圾对象,来减少内存泄漏的风险。
2.2 回收永久代
面试官:那永久代不会进行垃圾回收对吧?
虽然永久代的垃圾回收效率是比较低的,但永久代里的废弃常量和无用的类仍然会被回收。
例如创建一个字符串常量name,该字符串会存在于常量池中。如果该字符串没有任何String对象去引用它,当发生内存回收时有必要会清除该废弃常量。
private static final String name = "JavaGetOffer";
2.3 垃圾回收器
面试官:你说说都有哪些垃圾回收器?
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!