唯品会Java开发工程师校招一面面经

唯品会 · Java开发工程师 · 一面 · 2026-03

面试题目

基础部分

  1. 请先做一个简单的自我介绍。
  2. 对于Java中的锁机制,你有什么理解?
  3. 在悲观锁中,Java语言层面有哪些实现方式?它们之间的区别是什么?
  4. synchronized和reentrant lock在等待与唤醒机制上有什么区别?
  5. 你对线程池的理解是怎样的?在使用线程池执行任务时,一般需要注意哪些问题?
  6. 如何让主线程感知到线程内部的异常?
  7. 如果线上应用频繁出现GC问题,可能是什么原因导致的?
  8. Spring AOP使用的哪种设计模式及代理方式?在哪些场景下会使用Spring AOP,以及使用时应注意哪些问题?

数据库部分

  1. InnoDB数据库中的索引使用何种数据结构,B+树和B树有何区别?
  2. 在MySQL中,如何通过explain查询来分析执行计划并找出性能差的原因?
  3. 当查询涉及到多个字段且索引设计有问题时,该如何排查和优化?
  4. 对于存储数据量大的表,应如何分析其性能问题并提出解决方案?
  5. 在处理频繁的修改和查询操作时,如何避免引发性能问题?

项目实习

  1. 在对象存储中,你们采用了哪两种经典方式?
  2. 当时在测试环境中遇到了什么新问题?为了解决这个问题,你们采取了什么优化措施?

算法题

  1. 考察了一道Easy或Middle难度的算法题。

反问环节

  1. 部门业务大概是什么样的?(答:负责个性化工程平台,涵盖让利、触达、超级VIP体系及用户画像等)

参考解析

1. Java锁机制与线程池

  • 锁实现:synchronized是关键字,自动加锁解锁;ReentrantLock是API,提供公平锁、尝试锁、中断响应等高级特性。
  • 唤醒机制:synchronized使用Object.wait/notify,ReentrantLock使用Condition.await/signal,后者支持多个条件队列,灵活性更高。
  • 线程池问题:需注意核心线程数与队列配置防止OOM,避免使用Executors默认工厂,建议显式创建ThreadPoolExecutor。

2. JVM与性能监控

  • GC问题排查:常见原因包括对象分配速率过快(Eden区频繁Minor GC)、大对象直接进入老年代、元空间不足或内存泄漏。可通过jstat、jmap及GC日志分析。
  • 主线程感知异常:可使用Future.get()捕获ExecutionException,或在线程池内封装自定义UncaughtExceptionHandler。

3. MySQL索引与性能优化

  • B+树 vs B树:B+树叶子节点连接,利于范围查询;数据仅存叶子,非叶子节点更小,降低树高,减少磁盘IO。
  • Explain优化:关注type(避免ALL)、key(索引是否命中)、rows(估算扫描行数)、Extra(如Using filesort或Using temporary,需重点优化)。
  • 大表优化:可采取分区表、读写分离、分库分表或增加覆盖索引,避免回表查询。