【美团】后端一面复盘|项目驱动 + 手撕 + JVM + 数据库全面覆盖

发布于:2025-05-16 ⋅ 阅读:(40) ⋅ 点赞:(0)

【美团】后端一面复盘|项目驱动 + 手撕 + JVM + 数据库全面覆盖

📍 面试公司:美团
🎯 面试岗位:后端开发工程师
📞 面试形式:电话面(OC)
🕒 面试时长:约 50 分钟
🔁 面试轮次:第一轮技术面


✨ 面试整体节奏

这场美团的一面整体感觉是“项目驱动型”面试。面试官的问题多数是围绕我实际做过的项目展开的,穿插了一些八股基础与手撕考察,风格偏实战,细节问得很深。

由于没能录音,问题顺序是大致回忆整理,难度中等偏上,但非常考察“你做过什么、做得多细、做得多深入”。


✅ 面试问题逐题整理与解析

非技术问题

  1. 你有实习经历吗?在哪里实习的?
    简单介绍了下过往实习经历、公司规模和主要做的项目。

  2. 平时怎么学习后端技术?学习路径是什么?坚持了多久?
    回答了从 Java 基础、Spring 全家桶、到中间件、性能优化,结合项目同步迭代的学习路径。


技术问题

  1. 你们项目里为什么用 JWT?具体是怎么用的?用的是什么协议?
    讲了 JWT 的结构(Header、Payload、Signature),我们是用它做登录态的传递,结合 HTTP 协议放在 Header 中,用于用户鉴权。

  2. ThreadLocal 的底层原理是怎样的?为什么会引发内存泄漏?
    介绍了 ThreadLocalMap 的结构、弱引用 key、未及时 remove 时 value 被强引用导致泄漏的风险。

  3. 你们为什么用 ThreadLocal 存用户 ID?具体业务场景是?
    项目中用于日志链路追踪、权限判断等,避免在方法层层传递 userId。

  4. ThreadLocal 保存大量用户信息会不会导致内存溢出?考虑用 Redis 存储吗?
    分析了使用线程池时,ThreadLocal 不及时清理会有隐患。解释了我们是单体架构,并不会有太多线程长期驻留,此外使用 Redis 虽然能解决一些问题,但也引入了额外的复杂度。

  5. 详细说一下你项目里的库存管理模块,包括迭代过程、选型、如何落地和做一致性维护?
    从最开始的单体锁实现讲起,后面优化为分布式锁 + 本地缓存,结合 Redis + Lua 保证原子操作,同时讲了 MQ 异步刷库、对超卖的防控等。

  6. 项目中遇到过 OOM 吗?你们是怎么调优的?
    遇到过老年代爆内存,分析了内存 dump,发现是缓存泄漏导致。后面优化了缓存使用、调小了 JVM 内存参数,并开启了 G1 GC。

  7. 能详细说下你负责的核心业务流程吗?
    花了比较多时间讲订单业务的整体流程、服务拆分、中间件接入、异常处理和监控告警。

  8. MySQL 中使用 SELECT … FOR UPDATE 时加的是什么锁?
    行级排它锁(X 锁),会锁住符合条件的记录,阻塞其他事务的修改操作。

  9. MySQL 中共享锁和排他锁的区别是什么?
    共享锁(S 锁)允许并发读,不允许写;排他锁(X 锁)不允许读写,互斥性更强。

  10. MySQL 的 B+ 树和 B 树的区别是什么?为什么使用 B+ 树做索引更好?
    B+ 树所有数据都在叶子节点,叶子节点之间有链表结构,范围查询效率更高,且更适合磁盘页设计。

  11. 你们项目里 WebClient 是用的什么网络协议?
    是基于 HTTP 协议的非阻塞客户端,用于异步请求下游服务。

  12. WebClient 在项目中的具体使用场景?
    主要用于调用外部接口服务,例如第三方支付、物流平台等,用 Mono/Flux 做异步编排。

  13. 线程池相关问题,你们项目用的是哪种线程池?怎么配置的?
    用的是自定义 ThreadPoolExecutor,控制核心线程数、队列长度和拒绝策略,主要用于异步任务和定时任务执行。

  14. 垃圾回收器相关问题,G1 和 CMS 有什么区别?你们是怎么选择的?
    CMS 并发回收但有碎片问题,G1 做分区回收、延迟更低且能预测。项目中使用 G1,因为我们更关注响应时间的可控性。

  15. 其他问题:
    面试官根据我回答的项目内容,延伸问了一些缓存、消息队列、数据库优化的细节,零碎地记不太清了,但整体偏向八股融合实际应用。


🧠 手撕代码题

  1. 实现单例模式(双重检查锁)
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;
    }
}
  1. 实现责任链模式
    简化示例:多个处理器按顺序执行处理逻辑。
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);
    }
}
  1. SQL 编写题
    被强行锤了 10 分钟,确实没练 SQL,面试官耐心教了怎么写。建议后续加强 SQL 实战训练。

  2. 算法题
    给了一道简单题,但我写得比较慢,没有达到预期速度。暴露了刷题不够熟练的问题。


🙋‍♂️ 反问环节

  • 问了一下美团部门的主要业务方向、团队技术栈、以及学习建议。面试官给了挺多建议,比如多写代码、项目中要敢于钻透原理、平时多练 SQL 和算法。

  • 面试官也问了:目前还有其他 offer 吗?(感觉是在试探我当前的竞争情况)


🧾 总结 & 面试复盘

整体来说,美团这轮面试节奏挺快,问题质量高,项目问得深入,八股融合业务场景,手撕题也有实战要求。

我的项目准备还算充分,但手撕题和 SQL 明显暴露短板,后续要加强刷题训练 + SQL 练习,别在这些点上失分。


📢 最后:

如果你也在准备 Java 后端社招,可以留言交流,我会持续整理类似的高频面试题 + 项目思路拆解,祝大家都能稳稳上岸 💪!