第1章 · 岗位能力画像与简历优化
核心能力维度权重表
| 能力域 | 典型要求 | 面试占比 | 简历关键词 |
|---|---|---|---|
| 并发编程 & 异步 | Future、Akka、协程、无锁结构 | 25% | 高吞吐、背压、Actor模型 |
| JVM 调优 & GC | 内存模型、GC策略、对象逃逸 | 20% | Young/Old Gen、GC日志、调优 |
| 函数式 & 性能陷阱 | 惰性求值、递归、集合性能 | 20% | 尾递归、Stream、不可变数据 |
| Profiling & 基准 | JMH、YourKit、火焰图 | 15% | JMH 基准、热点分析、时序 |
| 系统设计与沟通 | 架构设计、性能需求分析、跨团队协作 | 20% | 服务压测、性能SLA、调优方案 |
面试官画像与公司侧重点
- 大厂面试官:通常为资深/专家级工程师,关注实际调优经验 & 深度原理,偏好候选人对 GC 细节、异步框架选型有真实案例。
- 中厂/独角兽:更看重问题解决链,如“发现 OOM → 定位 → 优化 → 验证”的完整闭环。
- 业务型公司:强调业务场景理解,能否将性能优化转化为可量化的 QPS、延迟、资源成本指标。
面试高频追问方向:JVM 逃逸分析如何影响栈上分配?Future.sequence 内存爆炸原因?
Akka 邮箱阻塞如何调优?Spark Shuffle 在 Scala 中的优化点有哪些?
回答框架概述
本章问题均采用 「STAR + 量化 + 对比」 框架:
S (背景) → T (任务) → A (核心优化动作) → R (可量化结果)。
额外加入 对比:优化前后对比、与其他方案对比、权衡取舍。
面试问题
你做过哪些 Scala / JVM 性能优化?请举一个具体例子。
面试官考察点
- 是否有真实的优化经历,而非背诵理论
- 能否结构化表达优化过程(定位→分析→实施→验证)
- 是否关注优化后的业务指标(延迟、吞吐、资源成本)
回答框架
STAR + 量化:S→T→A→R。核心动作包含 定位工具(如 YourKit)、问题根因、具体优化代码、效果数据。
简短示例回答
“某实时推荐服务 GC 停顿超 500ms。使用 YourKit 发现 G1 晋升失败频繁,对象年龄设置过大。将 -XX:MaxTenuringThreshold 从 15 降至 6,并优化缓存结构减少对象逃逸。GC 停顿降至 80ms,P99 延迟降低 40%。”
可能追问
- 为什么选择调整 TenuringThreshold 而不是直接扩容Heap?
- 如何验证优化后不会导致 Young GC 变频繁?
- 当使用 ZGC 时,上述调整是否仍然有效?
面试问题
Scala 中 Future.sequence 在处理大量并行任务时可能造成什么问题?如何优化?
面试官考察点
- 是否了解 Future 的内存模型及调度机制
- 能否识别典型陷阱(同时创建大量 Future 导致内存/线程膨胀)
- 有无实际场景解决方案(chunking、光纤、协程)
回答框架
问题定位 → 内存/上下文原因 → 具体方案(分片、阻塞队列、异步流式)→ 效果对比。
简短示例回答
“Future.sequence 会立即创建所有 Future,若任务数上万,内存暴涨且线程池饱和。我用 Iterator.grouped(200) 分批提交,并在每个批次内部用 Future.sequence,外部再用 fold 串联。结果消耗内存从 8GB 降到 1.2GB,任务总时间只增加 5%。”
可能追问
- 你的分批大小怎么确定的?有做压力测试吗?
- 如果使用 Monix Task 或 ZIO Fiber 怎么实现类似控制?
- Future.sequence 与 traverse 在异常处理上的区别?
面试问题
你如何评估一段 Scala 代码的性能?会使用哪些工具和指标?
面试官考察点
- 是否掌握 JMH 基准测试的正确写法(JVM预热、死代码消除、分支预测)
- 能否区分微观性能与宏观系统瓶颈
- 对火焰图、async-profiler 的熟悉程度
回答框架
评估流程:写 JMH 基准 → 排除优化陷阱 → 使用 profiler 定位热点 → 对比优化前后的分布。
简短示例回答
“先用 JMH 写微基准,通过 @BenchmarkMode(Mode.AverageTime) 和 -prof gc 收集 GC 影响。发现某集合操作耗时高,再用 async-profiler 火焰图定位到 List(:+) 导致 O(n) 复制。改用 Vector 后耗时从 320ns 降到 45ns,并验证了可重复性。”
可能追问
- JMH 里 Blackhole.consumeCPU 的使用场景?
- 火焰图如何区分用户态与内核态开销?
- 如果基准测试结果与线上表现不符,你会怎么排查?