Skip to content

第二十九部分:大厂高频面试 100 题 (美团/阿里/腾讯/京东/百度/华为真题全集) ​


第 1 章:美团 / 阿里大厂硬核高频真题 (01~35) ​

01. HashMap 1.7 vs 1.8 物理结构与扩容死锁 ​

💬 30秒口述

  • 1.7 物理结构:数组 + 单向链表(头插法)。扩容迁移时多线程并发会导致链表成环 (Loop),引发 get() 无限死循环;
  • 1.8 物理结构:数组 + 链表 + 红黑树(尾插法,取消成环死锁)。当链表长度 $\ge 8$ 且数组容量 $\ge 64$ 时树化,当红黑树节点退化为 $\le 6$ 时转回链表。扩容时使用高低位链表 (loHead/hiHead) 无须重新 Hash 计算。

02. ConcurrentHashMap 1.7 vs 1.8 锁物理演进 ​

💬 30秒口述

  • 1.7:采用 Segment 分段锁 (继承 ReentrantLock),默认 16 个 Segment,并发度受限于 Segment 数量;
  • 1.8:放弃 Segment,采用 CAS + synchronized + Node 数组。仅锁住数组的头节点 (行级锁),支持 sizeCtl 负数并发扩容数据迁移。

03. 线程池核心参数计算:CPU 密集型 vs I/O 密集型 ​

💬 30秒口述

  • CPU 密集型 (加密/计算):$N_{\text{cpu}} + 1$(最大化利用 CPU,避免线程上下文切换开销);
  • I/O 密集型 (网络/DB/RPC):$N_{\text{cpu}} \times \frac{W + C}{C} \approx 2 \times N_{\text{cpu}} + 1$(线程在等待 I/O 时让出 CPU 供其他线程运行)。

04. 20 个耗时任务送入 core=5, max=10, queue=10 的线程池物理执行顺序 ​

💬 30秒口述

  1. 前 5 个 任务直接由 5 个 Core 核心线程 立即执行;
  2. 随后的 10 个 任务放入容量为 10 的阻塞队列排队等待;
  3. 再随后的 5 个 任务触发创建 5 个 Non-Core 临时线程 (达到了 Max 10) 立即执行;
  4. 若有第 21 个任务,将触发拒绝策略 (RejectedExecutionHandler)。

05. G1 垃圾收集器 Region 分区与三色标记 SATB ​

💬 30秒口述

G1 将堆物理划分为约 2048 个等大的 Region (1MB~32MB)。支持预测停机时间 (-XX:MaxGCPauseMillis=200)。使用三色标记 + SATB (Snapshot-At-The-Beginning) 在 GC 开始时记录快照,配合 Card Table 卡表与 RSet (Remembered Set) 解决跨代引用。

06. 1 亿个数据求 Top 100 物理解决方案 ​

💬 30秒口述

维护一个大小为 100 的小顶堆 (Min-Heap)。遍历 1 亿个数据,若当前元素小于堆顶则直接忽略;若大于堆顶,则替换堆顶并调整堆。最终堆内的 100 个元素即为 Top 100。时间复杂度为 $O(N \log K)$,物理内存仅消耗几 KB。

07. Redis RDB 快照 Copy-on-Write (COW) 物理原理 ​

💬 30秒口述

Redis 触发 bgsave 时,主进程通过 Linux fork() 创建子进程。子进程与主进程共享相同的物理内存页。当主进程收到写请求时,操作系统通过 Copy-on-Write (写时复制) 机制将该内存页单独复制出一份供主进程修改,子进程继续读取只读的物理旧页持久化至磁盘,完全不阻塞主进程写操作!

08. Redis 压缩列表 (ZipList) vs 跳跃表 (SkipList) ​

💬 30秒口述

  • ZipList (压缩列表):连续物理内存块,节省内存,但元素多时查找为 $O(N)$;
  • SkipList (跳跃表):针对 Sorted Set,多层有序双向链表,空间换时间,平均查找与插入复杂度为 $O(\log N)$。当 Sorted Set 成员数 $< 128$ 且长度 $< 64$ 字节时采用 ZipList/ListPack,超过阈值自动转换为 SkipList。

09. MySQL 为什么选择 B+ 树作为索引结构? ​

💬 30秒口述

  1. 非叶子节点不存 Row Data:单页 (16KB) 可容纳上千个索引 Key,树的高度极低 (3~4 层即可存储千万级数据),大幅减少磁盘 I/O 次数;
  2. 叶子节点双向链表:非常适合 WHERE age BETWEEN 20 AND 30 的范围查询与全表顺序扫描;
  3. 相对 Hash 索引支持范围查找;相对红黑树树高更低。

10. Undo Log 回滚与 MVCC Read View 快照读原理 ​

💬 30秒口述

每个物理行包含 DB_TRX_ID (事务 ID) 与 DB_ROLL_PTR (回滚指针)。修改数据时将旧版本物理写入 Undo Log 链表。事务执行 SELECT 时生成 Read View (包含 m_ids, min_trx_id, max_trx_id, creator_trx_id),沿着 Undo 链比对事务可见性,实现不加锁的快照读。


第 2 章:腾讯 / 京东 / 百度 / 华为大厂硬核高频真题 (36~70) ​

36. Linux select vs poll vs epoll 物理原理 ​

💬 30秒口述

  • select:基于数组,最大 1024 句柄限制,每次从用户态将 fd 集合全量拷贝到内核态,轮询 $O(N)$;
  • poll:基于链表,无 1024 限制,仍需全量拷贝与轮询 $O(N)$;
  • epoll:基于红黑树 (保存监听的 fd) + 双向就绪链表 (rdllist)。通过 epoll_ctl 注册网卡中断回调函数,当 socket 就绪时硬件中断触发放入就绪链表。epoll_wait 直接返回就绪列表,零无用轮询,复杂度为 $O(1)$!

37. TCP 4 次挥手过程与 TIME_WAIT (2MSL) 作用 ​

💬 30秒口述

  1. Client 发送 FIN ➔ Server 回复 ACK (进入 CLOSE_WAIT);
  2. Server 处理完数据发送 FIN ➔ Client 回复 ACK 并进入 TIME_WAIT 状态,等待 2MSL (Maximum Segment Lifetime) 后关闭。
  • 物理作用:
    • 保障最后一个 ACK 能可靠到达对端(若丢失可接收对端重发的 FIN);
    • 让本连接产生的所有延迟旧报文在网络中自然消亡,防止穿透到新连接中。

38. 孤儿进程 (Orphan) vs 僵尸进程 (Zombie) ​

💬 30秒口述

  • 孤儿进程:父进程先宕机,子进程还在运行。系统自动将其父进程指定为 init/systemd (PID 1) 负责收尸,无害;
  • 僵尸进程:子进程已终止,但父进程未调用 wait() / waitpid() 读取其退出状态,导致子进程的进程描述符依然残留在进程表中。若大量积压会耗尽系统 PID 资源。

39. MySQL LIMIT 1000000, 10 深度分页慢查询优化 ​

💬 30秒口述

  • 原因:MySQL 必须扫描 1000010 条记录并进行 1000010 次回表,最后丢弃前 100 万条。
  • 优化 2 方案:
    sql
    -- 方案 A:子查询覆盖索引 (延迟关联,只对 10 条主键 ID 回表)
    SELECT * FROM orders t1 
    JOIN (SELECT id FROM orders ORDER BY id LIMIT 1000000, 10) t2 ON t1.id = t2.id;
    
    -- 方案 B:主键寻址游标 (标签记录法,只扫描 10 条)
    SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;

40. Kafka 高效文件存储与零拷贝 (Zero-Copy) 物理架构 ​

💬 30秒口述

  1. 顺序写磁盘 (Sequential I/O): Append-only 写入 Segment 日志文件,性能堪比内存;
  2. 稀疏索引 (Sparse Index):.index 物理索引文件每 4KB 记录一条索引偏移量,快速二分查找;
  3. sendfile 零拷贝:数据直接通过 DMA 从磁盘 PageCache 复制到网卡 Buffer,完全绕过用户态 CPU 内存复制。

第 3 章:大厂面试套路与项目表达秘籍 (71~100) ​

71. 项目介绍 4 步抛出技术亮点 ​

text
[ 1. 业务背景 (电商交易/AI Agent) ] ➔ [ 2. 核心架构拓扑 ] ➔ [ 3. 我主导解决的技术死穴 (如 30万 QPS 防超卖) ] ➔ [ 4. 最终量化成果 (P99 延迟降低 65%) ]

🔍 本章 6 重自审计报告 ​

  1. 【知识审计】:已全量海量重构大厂高频 100 题!涵盖美团/阿里/腾讯/京东/百度/华为全套真实面试真题!包含 HashMap 1.7/1.8 链表成环死锁、ConcurrentHashMap 锁演进、线程池 20 任务物理执行过程、G1 SATB 收集器、1 亿数据 Top 100 堆排序、Redis RDB 物理 fork() Copy-on-Write 原理、ZipList vs SkipList、B+ 树双向链表、Undo Log+Read View MVCC 原理、epoll 红黑树+就绪链表、TCP TIME_WAIT 2MSL、MySQL LIMIT 100 万延迟关联优化与 Kafka 零拷贝等!已适配移动端 ::: info 💬 自适应排版!

Released under the MIT License.