面试官问你了解GC吗?该怎么回答?

511 阅读4分钟
原文链接: mp.weixin.qq.com

点击上方“ 会讲历史的程序员”,选择“ 关注公众号”  技术文章第一时间送达!

现在 如果你去面试,面试官大概有90%的概率会问到你关于GC 的内容

下面分享一些我平时总结的GC的内容,面试能答到这个程度,问题应该不大

 GC算法(垃圾回收算法)

垃圾,在jvm中什么是垃圾?

一个对象已经不在存活了,可以视为垃圾。

判断一个对象是否存活有两种方式:

  • 1,每个对象有一个引用计数的属性,引用释放时减1,当计数为0即可回收,但是没办法解决对象循环调用的问题

  • 2,可达性分析:从GC roots开始向下搜索,搜索时走过的路径称为引用链,当一个对象没有任何引用链相连时,则证明此对象不可用,称之为不可达对象

如何回收? 回收的算法

  • 标记清除算法:先标记所有可以回收的对象,然后一次性回收;

  • 复制算法:内存分为两个大小相等的容量模块,每次使用其中的一块,当此块内存用完了,将还存活的对象复制到另一个空模块,然后把已经当前模块清除一次;

  • 标记压缩算法:与标记清除类似,但是后续步骤不是讲可回收对象清理,而是存活对象 往一边移动,可回收对象往一边移动,然后直接清除边界的可回收对象数据;

  • 分代收集算法:java堆分为新生代和旧生代,然后根据各个年代的特点进行最适当的收集算法;

找到可回收的对象,也有算法可以执行了,现在需要一个容器去干回收这件事情

  • Serial收集器 :串行收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。

  • ParNew收集器 :ParNew收集器其实就是Serial收集器的多线程版本。

  • Parallel收集器:Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量,吞吐量的差别。

  • Parallel Old 收集器:Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法 吞吐量的同时还有多线程,同时使用标记清除的算法。

  • CMS收集器:CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。为了更快的收集垃圾。

  • G1收集器:G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。

当你完整回答完上面的内容时,面试官如果深入问的话,大概率会问到CMS收集器的垃圾回收流程

CMS垃圾回收流程

  • 初始标记:会产生全局停顿,标记GC roots可以直接关联的对象,速度快

  • 并发标记:和用户线程一起,主要标记过程,标记全部对象

  • 重新标记:产生全局停顿,由于并发标记的时候,用户线程还在运行,因此正式清理前,在做修证

  • 并发清除:和用户线程一起,基于标记结果,直接清理对象

  • 特点:用户线程运行的过程中,分一半的cpu去运行GC,反应速度就会下降一半;清理阶段,用户线程又产生了大量对象,产生新的垃圾

最后,想说一点,其实我当时面试回答完这些问题时,面试官还问了我一个问题,他说:你觉得这些回答这些东西真实的工作中真的会用到关于GC调优方面的东西吗?

我当时回答说:真实的工作环境中,大部分情况下根本不会用到这个,但是我觉得是必须每个人都应该懂得东西,面试官微微一笑。