GC 在特定的语言里面,是一个极其重要的面试知识点,比如说 Golang 和 Java。
GC 的面试,主要是从三个维度进行考察:
- GC 的算法:例如引用计数,标记清扫,标记整理等,纯粹从算法的层面考察大家;
- GC 的实现:例如 JVM 中 HotSpot 实现的 CMS,G1等,重点考察这些实现的具体步骤,部分情况下会涉及细节;
- 实践:集中在,DEBUG 和调优。DEBUG是指,实践中是否遇到多 GC 相关的问题,如果遇到了,怎么解决的;调优则是发现实际中的 GC 的效果不理想,如何优化的问题;
因此 GC 要如何复习,才能面试顺利呢?
- 背熟算法;
- 背熟具体实现的步骤,部分重点实现要深挖细节。要熟记影响这些实现的参数,同时可以结合自己公司内部配置来记忆参数和理解;
- 准备案例,包括各种奇诡问题,优化案例。这里要注意的是,如果你亲自遇到过,那么就用你亲自遇到过,如果没有,用你同事遇到的问题;依旧没有,就用公司出过的问题;完全没遇到,就准备网上的案例;
那么常见的面试失误在哪里呢?
- 算法和实现不能区分清楚;
- 并行和并发不能区分清楚;
- 实现之间混淆;
- 遗漏了不同实现的参数配置及其影响;
- 未提前准备好各种案例;
那怎么样才能在 GC 面试里面刷出来亮点?—— 与众不同
- 别人不知道的,我知道;
- 别人知道的,我知道更多细节;
- 结合实际
- 结合内存分配器
- 横向比较
前两条很好理解,后一条如何理解呢?要知道,面试官面 GC,不管是面算法,面实现还是面调优,他就是想确认你能不能解决 GC 的问题。所以结合实际能够让他知道,你确实是知道如何解决 GC 问题的。
第四点则是一个盲点。就是大部分的人只关注过GC,但是没有关注过不同垃圾回收器,其内存是如何被分配的。比如说 CMS 采用了空闲链表法来管理空闲内存,就是一个很有特色的点。