字节跳动后端开发实习生一面面经
《面试题目》
- 自我介绍
- 项目相比同类 APP 有什么优势?知识库是怎么构建的?如果遇到知识冲突怎么解决?
- 向量检索和关键字检索的区别,从底层原理讲一下
- 举例说明单独使用向量检索/混合检索,与使用混合检索后精度提升的效果
- 会话记忆管理如何防止会话膨胀?长期记忆抽取时是从哪些方面限制内容的?
- 平时怎么用 AI 辅助编码?用的是本地部署模型还是线上模型?如何评估不同模型的效果?
- SSE 与 WebSocket 的区别是什么?
- 如果基于这个项目加一些线上监控功能,会怎么做?
- Redis 为什么是单线程的?单线程如何支持高并发?
- 缓存穿透、击穿、雪崩分别是什么?如何解决?
- GC 的判定方法是什么?内存泄漏和 OOM 的区别是什么?
- 场景题:一个接口很多用户访问超时,但内存和 CPU 都正常,该如何排查?
- 设计一个自动化测试工具来测试信息流的上下滑动、画面正常性、视频不重复及个性化推荐
- 算法题:最长上升子序列
《参考解析》
- SSE 与 WebSocket 的区别:SSE(Server-Sent Events)基于 HTTP 长连接,是服务端到客户端的单向推送,实现简单、自带断线重连,适合日志推送、AI 流式输出等场景;WebSocket 是全双工协议,客户端和服务端可以双向实时通信,适合聊天、实时协作等需要频繁双向交互的场景,但实现和维护成本相对更高。
- Redis 单线程为什么还能支持高并发:核心在于 I/O 多路复用(如 epoll)——单个线程通过事件循环同时监听多个客户端连接的读写事件,只在真正有数据可读写时才处理,避免了传统多线程模型下的线程切换开销和锁竞争;同时 Redis 的数据操作都在内存中完成,命令执行本身足够快,所以单线程也能达到很高的吞吐量。
- 最长上升子序列(LIS):O(n²) 的动态规划解法是
dp[i]表示以第 i 个元素结尾的最长上升子序列长度,dp[i] = max(dp[j]) + 1(对所有j<i且nums[j]<nums[i]);更优的 O(n log n) 解法维护一个 tails 数组,遍历元素时用二分查找找到第一个大于等于当前值的位置替换(或追加到末尾),tails 数组的长度即为 LIS 的长度。 - 内存泄漏与 OOM 的区别:内存泄漏是指对象已经不再被使用,但由于错误的引用关系导致 GC 无法回收,长期积累会耗尽内存;OOM(OutOfMemoryError)是内存泄漏积累到一定程度或单次分配的对象过大导致的最终结果——即内存泄漏是”因”,OOM 往往是”果”之一,但 OOM 也可能是正常业务下瞬时内存需求超过堆容量导致,不一定存在泄漏。