【美团】后端一面复盘|项目驱动 + 手撕 + JVM + 数据库全面覆盖
【美团】后端一面复盘|项目驱动 + 手撕 + JVM + 数据库全面覆盖
📍 面试公司:美团
🎯 面试岗位:后端开发工程师
📞 面试形式:电话面(OC)
🕒 面试时长:约 50 分钟
🔁 面试轮次:第一轮技术面
✨ 面试整体节奏
这场美团的一面整体感觉是“项目驱动型”面试。面试官的问题多数是围绕我实际做过的项目展开的,穿插了一些八股基础与手撕考察,风格偏实战,细节问得很深。
由于没能录音,问题顺序是大致回忆整理,难度中等偏上,但非常考察“你做过什么、做得多细、做得多深入”。
✅ 面试问题逐题整理与解析
非技术问题
-
你有实习经历吗?在哪里实习的?
简单介绍了下过往实习经历、公司规模和主要做的项目。 -
平时怎么学习后端技术?学习路径是什么?坚持了多久?
回答了从 Java 基础、Spring 全家桶、到中间件、性能优化,结合项目同步迭代的学习路径。
技术问题
-
你们项目里为什么用 JWT?具体是怎么用的?用的是什么协议?
讲了 JWT 的结构(Header、Payload、Signature),我们是用它做登录态的传递,结合 HTTP 协议放在 Header 中,用于用户鉴权。 -
ThreadLocal 的底层原理是怎样的?为什么会引发内存泄漏?
介绍了 ThreadLocalMap 的结构、弱引用 key、未及时 remove 时 value 被强引用导致泄漏的风险。 -
你们为什么用 ThreadLocal 存用户 ID?具体业务场景是?
项目中用于日志链路追踪、权限判断等,避免在方法层层传递 userId。 -
ThreadLocal 保存大量用户信息会不会导致内存溢出?考虑用 Redis 存储吗?
分析了使用线程池时,ThreadLocal 不及时清理会有隐患。解释了我们是单体架构,并不会有太多线程长期驻留,此外使用 Redis 虽然能解决一些问题,但也引入了额外的复杂度。 -
详细说一下你项目里的库存管理模块,包括迭代过程、选型、如何落地和做一致性维护?
从最开始的单体锁实现讲起,后面优化为分布式锁 + 本地缓存,结合 Redis + Lua 保证原子操作,同时讲了 MQ 异步刷库、对超卖的防控等。 -
项目中遇到过 OOM 吗?你们是怎么调优的?
遇到过老年代爆内存,分析了内存 dump,发现是缓存泄漏导致。后面优化了缓存使用、调小了 JVM 内存参数,并开启了 G1 GC。 -
能详细说下你负责的核心业务流程吗?
花了比较多时间讲订单业务的整体流程、服务拆分、中间件接入、异常处理和监控告警。 -
MySQL 中使用 SELECT … FOR UPDATE 时加的是什么锁?
行级排它锁(X 锁),会锁住符合条件的记录,阻塞其他事务的修改操作。 -
MySQL 中共享锁和排他锁的区别是什么?
共享锁(S 锁)允许并发读,不允许写;排他锁(X 锁)不允许读写,互斥性更强。 -
MySQL 的 B+ 树和 B 树的区别是什么?为什么使用 B+ 树做索引更好?
B+ 树所有数据都在叶子节点,叶子节点之间有链表结构,范围查询效率更高,且更适合磁盘页设计。 -
你们项目里 WebClient 是用的什么网络协议?
是基于 HTTP 协议的非阻塞客户端,用于异步请求下游服务。 -
WebClient 在项目中的具体使用场景?
主要用于调用外部接口服务,例如第三方支付、物流平台等,用 Mono/Flux 做异步编排。 -
线程池相关问题,你们项目用的是哪种线程池?怎么配置的?
用的是自定义 ThreadPoolExecutor,控制核心线程数、队列长度和拒绝策略,主要用于异步任务和定时任务执行。 -
垃圾回收器相关问题,G1 和 CMS 有什么区别?你们是怎么选择的?
CMS 并发回收但有碎片问题,G1 做分区回收、延迟更低且能预测。项目中使用 G1,因为我们更关注响应时间的可控性。 -
其他问题:
面试官根据我回答的项目内容,延伸问了一些缓存、消息队列、数据库优化的细节,零碎地记不太清了,但整体偏向八股融合实际应用。
🧠 手撕代码题
- 实现单例模式(双重检查锁)
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized(Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
- 实现责任链模式
简化示例:多个处理器按顺序执行处理逻辑。
abstract class Handler {protected Handler next;public void setNext(Handler next) { this.next = next; }public abstract void handle(String request);
}class AuthHandler extends Handler {public void handle(String request) {if (request.contains("auth")) {System.out.println("认证成功");}if (next != null) next.handle(request);}
}class LogHandler extends Handler {public void handle(String request) {System.out.println("记录日志");if (next != null) next.handle(request);}
}
-
SQL 编写题
被强行锤了 10 分钟,确实没练 SQL,面试官耐心教了怎么写。建议后续加强 SQL 实战训练。 -
算法题
给了一道简单题,但我写得比较慢,没有达到预期速度。暴露了刷题不够熟练的问题。
🙋♂️ 反问环节
-
问了一下美团部门的主要业务方向、团队技术栈、以及学习建议。面试官给了挺多建议,比如多写代码、项目中要敢于钻透原理、平时多练 SQL 和算法。
-
面试官也问了:目前还有其他 offer 吗?(感觉是在试探我当前的竞争情况)
🧾 总结 & 面试复盘
整体来说,美团这轮面试节奏挺快,问题质量高,项目问得深入,八股融合业务场景,手撕题也有实战要求。
我的项目准备还算充分,但手撕题和 SQL 明显暴露短板,后续要加强刷题训练 + SQL 练习,别在这些点上失分。
📢 最后:
如果你也在准备 Java 后端社招,可以留言交流,我会持续整理类似的高频面试题 + 项目思路拆解,祝大家都能稳稳上岸 💪!