面灵AI→

恒生电子一面:JVM 垃圾回收、MySQL 索引与 MCP

轮次
一面
结果
已过
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍。
  2. JVM 的垃圾回收机制介绍一下?
  3. 聊聊你对 MySQL 索引的理解?什么场景适合建索引,什么场景不适合?
  4. MCP 了解过吗?介绍一下?
  5. 实习期间最大的收获和提升是什么?
  6. 实习期间的工作内容是什么?
  7. 你用 AI 进行开发时,有没有一套自己的工作流?是使用裸的开发 Agent,还是会搭配一些 skill、spec、workflow?
  8. 反问。

《参考解析》

JVM 垃圾回收机制建议按「怎么判断垃圾 → 怎么回收 → 什么时候回收 → 用什么回收器」这条线讲,比零散背名词清楚得多。判断对象是否存活用的是可达性分析:从 GC Roots(栈上局部变量、静态字段、常量、JNI 引用等)出发做遍历,不可达的对象才可回收;引用计数因为解决不了循环引用,主流虚拟机不用它。回收算法有三种:标记-清除不移动对象但会产生内存碎片,复制把存活对象拷到另一半空间、没有碎片但浪费空间,标记-整理移动并压缩、适合对象存活率高的场景。堆按分代组织:新生代分成 Eden 加两块 Survivor,新对象先分配在 Eden,Minor GC 时把存活对象复制到 Survivor 并年龄加一,年龄到阈值(默认 15)或对象太大、Survivor 放不下时晋升老年代;老年代满了触发 Full GC。收集器按「停顿优先还是吞吐优先」区分,常见的是 ParNew / Parallel Scavenge 这类分代收集器、CMS 的并发标记清除、G1 的分区加可预测停顿模型,以及 ZGC / Shenandoah 这类以亚毫秒停顿为目标的低延迟收集器。收尾可以补一句工程判断:大多数 GC 问题不是靠换收集器解决的,而是先看对象的分配速率与生命周期——短命大对象、缓存无上限、ThreadLocal 未清理、频繁 Full GC 时先用 jstat / GC 日志定位,再决定调堆大小、分代比例还是换收集器。

MySQL 索引要能讲到 B+ 树这一层。InnoDB 的索引是 B+ 树:非叶子节点只存键、叶子节点存数据并用双向链表相连,所以树高通常只有三到四层,等值查询、范围查询和排序都能走同一条路径;聚簇索引的叶子节点就是整行数据(主键即数据组织方式),二级索引的叶子节点存的是主键值,因此用二级索引查非索引列要回表一次,如果查询需要的列都在索引里就是覆盖索引,可以完全避免回表。联合索引遵守最左前缀:(a,b,c) 能用于 a、a,b、a,b,c 的条件,也能用于 a 后的范围条件,但跳过 a 直接用 b 就用不上;范围条件之后的列只能过滤不能定位。

适合建索引的是:WHERE / JOIN / ORDER BY / GROUP BY 里高频出现、区分度高的列;作为外键或关联键的列;需要保证唯一性的列(唯一索引既是约束也是索引)。联合索引的列序把区分度高的、等值条件多的放前面,把范围条件放最后。

不适合建的:区分度极低的列(性别、状态位只有两三个取值,全表扫描可能更快);写多读少的表上的大量单列索引(每个索引都要跟着维护,写放大、占空间);几乎不在查询条件里出现的列;列上要频繁做函数、类型转换或前模糊匹配(like '%x')的查询(会让索引失效);表本身很小(几千行以内,全表扫描成本可忽略)。另外记住索引的代价:优化器可能选错索引,统计信息不准时会走错路,此时用 EXPLAIN 看 type、key、rows 和 Extra(Using filesort / Using temporary)再决定是加索引、改写法还是 ANALYZE TABLE。

MCP(Model Context Protocol)是给模型接工具和数据源定的一套标准协议,可以理解成「AI 应用的 USB-C」:它规定客户端如何发现服务端提供了哪些工具、资源和提示模板,以及怎么用统一的 JSON-RPC 消息去调用它们。它解决的是集成层面的N×M 问题——以前每换一个模型或框架,每个数据源都要重写一遍对接代码;有了协议,数据源实现一次 MCP Server,任何支持 MCP 的客户端都能接。三个核心概念是 tools(可调用的动作,带 JSON Schema 描述参数)、resources(可读取的数据,如文件、数据库表、文档)、prompts(预置的提示模板)。它和 function calling 的区别在于层次:function calling 是模型厂商提供的「模型输出一次结构化调用」的能力,MCP 管的是「这个工具从哪来、怎么被发现、怎么复用」,两者是配合关系。工程上要注意它的安全边界——MCP Server 往往拿着真实凭据、能读写外部系统,所以工具要有最小权限、参数校验和审计,涉及写操作或敏感数据的工具还需要人工确认。

「用 AI 开发有没有自己的工作流」这类问题,面试官真正想听的是你有没有把 AI 从「补全工具」用成「工程环节」。可以按层次回答:需求与设计阶段用对话式工具做方案对比和技术选型;编码阶段用带仓库上下文的 Agent(IDE 插件或命令行 Agent)做改动,关键是给它约束——把项目规范、目录约定、验收标准写成可复用的配置或规则文件,而不是每次口头描述;验证阶段让 AI 生成边界用例和回归清单,但结果必须自己跑通;最后是判断哪些事不该交给 AI:涉及线上数据、权限、不可逆操作的一律自己做。裸 Agent 与 skill / spec / workflow 的取舍可以这样说:一次性、探索性任务用裸 Agent 最灵活;重复出现的任务把流程固化成 spec 或 workflow,换来的是可复现、可交接、少返工;上下文成本高、只需要一个结论的任务封装成 skill 按需加载。能举出自己项目里一两条具体做法(哪个环节省了多少时间、哪次因为没写约束而返工)比罗列工具名有说服力得多。

实习相关的问题按 STAR 组织即可,重点是「你的动作」和「可量化的结果」。回答「最大的收获」最容易空泛,稳妥的结构是:先说一个具体场景(遇到什么问题、你做了什么),再说方法层面的沉淀(比如学会了先对齐口径、先写验证标准再动手、把重复流程工具化),最后落到可迁移的东西。「实习工作内容」不要只报项目名,用一两句话说清系统是做什么的、你负责哪部分、上下游是谁、交付量级如何;面试官通常会顺着这里的细节往下追两层,所以每提到一个技术点都要能接着讲清取舍。