杭州飞书字节日常实习后端一面面经

字节跳动(飞书) · Java后端开发实习生 · 一面 · 杭州 · 2026-07

《面试题目》

  1. 自我介绍
  2. 项目中动态线程池热更新的实现流程是怎样的?
  3. LinkBlockingQueue 源码做了哪些修改?
  4. 为什么要引入 Nacos?
  5. JVM 内存结构是怎样的?如何判断对象是否是垃圾?
  6. 出现 OOM 该如何排查?
  7. MySQL 的 B+树索引结构,什么是覆盖索引?什么是索引下推?最左匹配原则在哪些情况下会失效?哪些字段适合建索引?
  8. EXPLAIN 命令中 type 字段的 range 是什么含义?还了解哪些其他字段?
  9. 什么是事务?隔离级别有哪些?MVCC 的原理是什么?
  10. Redis 分布式锁如何实现?如何保证独占、续期、原子性和可重入性?
  11. Synchronized 和 Redis 分布式锁有什么区别?
  12. Spring 的 IOC 和 AOP 了解多少?IOC 是如何实现的?如果字段是 private,反射注入时如何绕过限制?
  13. Spring 有哪些扩展点?Bean 的生命周期是怎样的?
  14. 数据库和缓存之间的一致性怎么保证?
  15. 有一个订单需要延时发送,有哪些实现方案?
  16. 算法题:分割回文子串
  17. 能实习多久?反问环节

《参考解析》

  1. 动态线程池热更新:核心思路是把线程池参数(核心数、最大数、队列容量、拒绝策略)托管到配置中心(如 Nacos),线程池实例持有一个可变的委托对象,监听配置变更事件后通过 setCorePoolSize() / setMaximumPoolSize() 等方法动态调整,无需重启应用即可生效;调整前要注意队列已有任务和当前活跃线程数的边界情况,避免瞬时收缩导致任务被拒绝。
  2. MySQL 索引下推与覆盖索引:索引下推(ICP)是指在联合索引遍历过程中,将 WHERE 条件中能通过索引字段判断的部分提前在存储引擎层过滤,减少回表次数;覆盖索引则是查询所需的所有列都能在索引中直接取到,无需回表查主键索引。最左匹配原则失效常见于对索引列使用函数、隐式类型转换、OR 连接非索引列,或范围查询之后的列。
  3. 数据库与缓存一致性:业界主流是 Cache Aside(旁路缓存)模式,更新时”先更新数据库、再删除缓存”;为应对删除失败或并发脏读,可搭配延时双删或监听 binlog(如 Canal)异步淘汰缓存做兜底,强一致性场景则需要引入分布式事务或读写穿透(Write/Read Through)方案。
  4. 延时消息实现:常见方案一是使用消息队列自带的延时/定时消息能力(如 RocketMQ 的定时消息、RabbitMQ 死信队列 + TTL);方案二是自行维护一个基于时间戳排序的 ZSet,用异步线程定时轮询到期任务再触发投递,适合延时时间不固定的场景。