Java 后端社招面试突击指南,按专题分类整理。点击专题名进入对应文件,点击小节标题跳转到对应问题位置。
答题深度与追问方法:面试问题深挖指南
分类与
interview/目录结构保持一致:Java / 框架 / 数据库 / 中间件 / 计算机基础 / 分布式与架构 / 工程实践 / 面试。
Java
Java基础
- JVM、JDK、JRE 三者关系?
- int 和 Integer 的区别?
- String、StringBuilder、StringBuffer 区别?
- == 和 equals 的区别?
- 值传递 vs 引用传递
- static 关键字的四种用法
- BigDecimal 为什么比 double 更适合金额计算?
- Enum 枚举
- 面向对象六大设计原则?
- 抽象类和接口的区别?
- 内部类
- Java 创建对象有哪几种方式?
- 深拷贝和浅拷贝的区别?
- 单例模式(双重检查锁定)
- 策略模式 vs 责任链模式
- 代理模式 vs 适配器模式
- 泛型是如何实现的?为什么说是”伪泛型”?
- 反射机制及应用场景?
- Java 注解的原理?
- SPI 机制:ServiceLoader 是怎么找到实现类的?
- 受检异常 vs 非受检异常?
- Lambda 表达式和函数式接口
- Stream API
- Optional 类
- CompletableFuture 异步编程
- BIO、NIO、AIO 的区别?
- NIO 三大核心组件
- 序列化和反序列化
- 什么是内部类?内部类有哪些类型?使用场景是什么?
- this 和 super 关键字在 Java 中的作用和区别是什么?
- Java 中的枚举类型是如何定义的?枚举相比常量有什么优势?
- 如何设计一个不可变类?
- 组合与继承各有什么优缺点?什么情况下选择组合而不是继承?
- 泛型擦除是什么?它如何影响泛型运行时的行为?
- Java 常见的异常类有哪些?
- 如何在 Java 中自定义异常?
- Java 中的方法引用(Method References)是什么?如何使用?
集合框架
- ArrayList 和 LinkedList 的性能差异?
- ArrayList 扩容机制
- ArrayList 为什么不是线程安全的?
- ArrayList 和 Vector 的区别
- CopyOnWriteArrayList 适合什么场景?
- HashMap 的底层实现和扩容机制?
- HashMap 的 get 过程?
- HashMap 为什么容量是 2 的幂?
- HashMap 多线程下会出什么问题?
- HashMap 和 Hashtable 的区别
- ConcurrentHashMap 如何保证线程安全?
- ConcurrentHashMap JDK 1.7 vs 1.8 的区别
- ConcurrentHashMap 为什么同时用 CAS 和 synchronized?
- HashSet 的实现原理
- TreeMap 和 TreeSet:什么时候用红黑树容器?
- LinkedHashMap 实现 LRU 缓存
- 接口与实现类
- ArrayDeque vs LinkedList
- PriorityQueue(优先队列)
- BlockingQueue(阻塞队列)
- List 遍历中能修改元素吗?
- PriorityQueue 是如何实现优先级队列的?
- LinkedHashSet 和 HashSet 的区别是什么?
- ListIterator 和 Iterator 的区别是什么?
- 如何实现一个不可变的集合?
并发编程
- JMM(Java 内存模型)
- Java 线程 vs 操作系统线程
- 线程的 6 种状态
- BLOCKED 和 WAITING 的区别
- sleep 和 wait 的区别
- 如何正确停止线程
- 两个线程交替打印奇偶数
- synchronized 和 ReentrantLock 的区别?
- synchronized 锁升级过程
- JVM 对 synchronized 的优化
- 公平锁 vs 非公平锁
- 锁的分类总结
- 什么是死锁,如何避免?
- volatile 关键字的作用?
- CAS 的原理和问题
- AQS(AbstractQueuedSynchronizer)
- CountDownLatch vs CyclicBarrier
- Semaphore
- ThreadLocal 原理和内存泄漏
- 线程池核心参数(7 个)
- 线程池拒绝策略
- 线程池线程数设置经验
- newCachedThreadPool
- ForkJoinPool 工作窃取
- Semaphore 信号量怎么用?
- StampedLock 是什么?与 ReadWriteLock 相比有什么优势?
- 什么是守护线程?有什么特点?
- 线程中断机制:如何优雅地停止一个正在运行的线程?
- 什么是活锁?如何避免?
- 锁粗化和锁消除分别是什么?
JVM
- 运行时数据区有哪些?各自会出现什么 OOM?
- 对象创建过程
- 对象在内存中的布局
- GC Roots 有哪些?
- 强软弱虚四种引用
- GC 算法:标记-清除、标记-复制、标记-整理怎么选?
- 对象什么时候会从新生代晋升到老年代?
- 三色标记:并发标记为什么会漏标?怎么解决?
- G1 收集器原理
- 什么时候该用什么 GC 收集器?
- 安全点与安全区域
- JIT 编译优化
- 类加载过程:一个类从 class 文件到可用要经历什么?
- 双亲委派的破坏场景
- 类卸载的苛刻条件
- JVM 调优的方法论:从目标到证据链
- JVM 常用调优参数
- 如何排查内存泄漏?
- OOM 有哪几种?分别怎么排查?
- 堆外内存(直接内存)是什么?与堆内存有何区别?
- 对象的组成:对象头、实例数据、对齐填充
- 栈帧是什么?包含哪些信息?
- JIT 编译是什么?如何优化热点代码?
- 逃逸分析是什么?对性能有什么影响?
- 方法内联是什么?对性能有什么影响?
- 字符串常量池是什么?如何实现的?
Java现代特性
- Java 8、17、21、25 应重点关注什么?
- 21 要注意什么?
- JDK 24、26 有什么关键变化?
- Record 是什么?
- Record 适合和不适合什么场景?
- sealed class 解决什么问题?
- switch 模式匹配有什么价值?
- Record Pattern 是什么?
- 虚拟线程是什么?
- 虚拟线程适合哪些场景?
- 虚拟线程是否还需要线程池?
- 什么是虚拟线程 pinning?
- Scoped Value 解决什么问题?
- Optional 应该如何正确使用?
- Stream 并行执行要注意什么?
- 模块系统 JPMS 解决什么问题?
- 结构化并发(StructuredTaskScope)解决什么问题?
框架
Spring
- 控制反转、依赖注入、依赖倒置的区别?
- 三种依赖注入方式的区别?
- IoC 的实现机制?
- BeanFactory 和 FactoryBean 的区别?
- 容器启动 refresh() 做了什么?(源码级)
- @Autowired 是怎么完成注入的?
- AOP 的实现方式(JDK 动态代理 vs CGLIB)?
- 为什么同类方法内部调用会导致 AOP 失效?(自调用问题)
- Spring 事务什么时候会失效?
- Spring 如何解决循环依赖?
- 为什么必须用三级缓存?二级不够?
- 哪些情况 Spring 无法解决循环依赖?
- Spring Bean 的作用域?
- Singleton vs Prototype 生命周期区别?
- Spring Bean 的完整生命周期?
- Spring 事件机制如何工作?
- Spring 中用到的设计模式
- SpringMVC 处理流程?(doDispatch 源码级)
- HandlerMapping 和 HandlerAdapter 的作用?
SpringBoot
- Spring Boot 自动配置的原理?
- SpringBoot 过滤器 vs 拦截器?
- SpringBoot 如何做到导入即可用?
- SpringBoot 2.7+ 自动配置变更
- @Conditional 条件注解有哪些?
- 如何自定义 SpringBoot Starter?
- SpringBoot 约定大于配置
- Spring Boot 启动流程?
ApplicationRunner和CommandLineRunner有什么区别?- SpringBoot 内嵌 Tomcat 是怎么启动的?
- Spring Boot 配置的常见优先级?
@Value和@ConfigurationProperties的区别?- 配置刷新要注意什么?
- 如何做统一异常处理?
- 如何做参数校验?
- Filter、Interceptor、AOP 如何选择?
- Spring Boot Actuator 有什么作用?
- Spring Boot 如何实现优雅停机?
- Spring Boot 应用启动失败怎么排查?
SpringCloud微服务
- 微服务的服务间通信方式?
- SpringCloud vs SpringBoot 区别?
- 核心微服务组件
- 负载均衡算法
- 服务熔断 vs 服务降级
- 服务注册与发现的基本流程?
- Nacos 临时实例和持久实例有什么区别?
- 配置中心如何保证变更安全?
- API 网关的职责有哪些?
- OpenFeign 调用需要注意什么?
- 客户端负载均衡和服务端负载均衡的区别?
- 限流、熔断和系统保护有什么区别?
- Sentinel 常见流控模式?
- 如何防止服务雪崩?
- 微服务如何保证数据一致性?
- 如何设计跨服务 Trace?
- 微服务一定比单体好吗?
MyBatis
#和$的区别?- MyBatis 的优势
- JDBC 连接步骤
- @Mapper 和 @Repository 的区别?
- MyBatis 执行一条 SQL 的流程?
- MyBatis 中 Executor 有哪些类型?
- 一级缓存和二级缓存的区别?
- 为什么生产项目经常不用 MyBatis 二级缓存?
- 常用动态 SQL 标签有哪些?
resultType和resultMap的区别?- MyBatis 插件原理?
- 分页插件的基本原理?
- MyBatis-Plus 和 MyBatis 的关系?
- Mapper 方法传多个参数为什么常用
@Param? - MyBatis 是如何整合进 Spring 的?
Netty与RPC
- Netty 解决什么问题?
- Netty 的核心组件有哪些?
- Netty 的线程模型是什么?
- 为什么不能在 EventLoop 中执行耗时任务?
- ChannelHandler 是否线程安全?
- EventLoopGroup 是怎么管理线程的?
- ByteBuf 相比 ByteBuffer 有什么优势?
- 什么是引用计数?为什么会内存泄漏?
- 堆内存和直接内存如何选择?
- Netty 内存池是怎么分配的?(PooledByteBufAllocator)
- Netty 的零拷贝体现在哪?
- 拆包如何解决?
- 自定义协议通常包含哪些字段?
- 如何防止非法长度导致内存攻击?
- 如何设计心跳和空闲连接检测?
- Netty 客户端断线如何重连?
- Netty 如何处理背压?
- RPC 框架的核心组成?
- RPC 为什么需要动态代理?
- RPC 如何匹配异步响应?
- RPC 重试要注意什么?
- 常见序列化方式如何选择?
- HTTP、gRPC、Dubbo 如何选择?
数据库
MySQL
- MySQL InnoDB 和 MyISAM 的区别?
- MySQL 索引如何优化查询?
- 如何优化慢查询?
- 数据库三大范式是什么?
- JOIN 联表查询类型
- MySQL 如何避免重复插入?
- CHAR 和 VARCHAR 的区别
- INT(1) 和 INT(10) 有什么区别?
- IP 地址如何存储?
- IN 和 EXISTS 的区别
count(*)、count(1)、count(列名)有什么区别?- MySQL 中 NULL 是怎么存储的?
- SQL 查询语句的执行顺序
- MySQL 执行一条 SQL 的过程
- 常见存储引擎对比
- 数据文件类型
- Buffer Pool 与改进版 LRU
- B+树 vs B树 vs 二叉树 vs Hash
- B+树叶子节点查找优化
- 聚簇索引 vs 二级索引
- 什么字段适合做主键?
- 区分度低的字段(如性别)不建议建索引
- 联合索引与最左前缀原则
- 索引失效的 6 种情况
- 索引优化方法
- 索引有哪些种类?
- 什么时候需要创建索引?什么时候不需要?
- 什么是全文索引?如何使用?
- JOIN 底层用什么算法?为什么要小表驱动大表?
- 事务四大特性(ACID)及实现
- 并发问题:脏读、不可重复读、幻读
- 四种隔离级别
- MVCC 实现原理
- 滥用大事务的弊端
- 当前读 vs 快照读:RR 到底解决幻读了吗?
- MySQL 锁分类
- 非索引字段的范围更新会导致全表加锁
- 悲观锁和乐观锁的区别?
- 行级锁和表级锁有什么区别?
- 三类核心日志
- binlog 三种格式
- redo log 为什么不用直接写 B+树?
- 两阶段提交过程
- Double Write Buffer
- EXPLAIN 关键字段
- 慢查询解决方案
- 主从复制过程
- 分库分表
- 加索引?
- 数据库连接池(HikariCP)为什么这么快?
- 数据库的视图和存储过程是什么?有什么区别?
- MySQL 中的触发器是什么?如何使用?
- 数据库的外键是什么?有什么作用?
- MySQL 中的临时表是什么?如何使用?
- 什么是数据库的数据字典?有什么作用?
- 数据库的备份和恢复策略有哪些?
Redis
- Redis 为什么快?
- Redis 和 Memcached 有什么区别?
- Redis 数据结构
- 持久化的两种方式?
- 高可用方案对比
- 主从全量同步 vs 增量同步
- PSYNC 如何判定走全量还是增量?(源码级)
- 哨兵怎么判定故障、怎么选主?
- 主从延迟与数据丢失窗口
- Cluster 为什么是 16384 个槽?槽迁移时请求怎么路由?
- 缓存穿透、击穿、雪崩如何解决?
- 缓存预热:冷启动时怎么避免打挂数据库?
- String 使用 SDS 存储
- Zset 底层实现
- 跳表实现原理
- Redis 为什么用跳表而非 B+树?
- 压缩列表与 listpack
- 哈希表渐进式 rehash
- Redis 单线程为什么快?
- Redis 哪些地方使用了多线程?
- IO 多路复用实现
- 如何保证 Redis 原子性?
- 过期删除策略
- 内存淘汰策略(8 种)
- Redis 比 MySQL 快的原因
- 本地缓存 vs Redis 分布式缓存
- 缓存与 MySQL 数据一致性
- 大 Key 问题
- 热 Key 问题
- 秒杀场景设计
- Redis 分布式锁怎么实现?
- 布隆过滤器
- 缓存策略
- 批量操作怎么选:pipeline vs mget vs Lua?
中间件
消息队列
- 核心概念
- 消息队列如何保证消息不丢失?
- Kafka vs RabbitMQ vs RocketMQ?
- 消息队列为什么会有重复消费?怎么解决?
- 消息积压了怎么办?
- RocketMQ 消息过滤机制
- RocketMQ 事务消息如何实现?
- RocketMQ 消息顺序怎么保证?
- RocketMQ 存储模型:CommitLog 为什么和 Kafka 分区存储不一样?
- Kafka 日志存储:segment 和稀疏索引怎么按 offset 找到一条消息?
- Kafka 为什么这么快?
- Kafka 是推模式还是拉模式?为什么?
- RabbitMQ 延迟队列和死信机制
- Kafka 的 ISR、HW、LEO 是什么?副本是怎么同步的?
- Kafka rebalance 什么时候发生?有什么危害?怎么减少?
- Kafka 如何实现 exactly-once?
- 消息重试机制
- Kafka 为什么不支持读写分离?分区数是不是越多越好?
- 如何设计一个消息队列?
Elasticsearch
- Elasticsearch 适合什么场景?
- Index、Document、Field 分别是什么?
- 分片和副本有什么作用?
- ES 路由机制(Routing)是如何工作的?
- 倒排索引是什么?
text和keyword的区别?- 分词器由什么组成?
- Mapping 为什么重要?
- 文档写入流程?
- Refresh、Flush、Translog 的区别?
- 搜索请求的 Query Then Fetch 流程?
- Filter 和 Query 有什么区别?
- 乐观锁)?
match和term的区别?- BM25 是什么?
must、should、filter、must_not如何理解?- Elasticsearch 深分页为什么慢?
- 深分页如何优化?
- Aggregation 有哪些常见类型?
- 写入性能如何优化?
- 查询性能如何优化?
- 分片数量如何规划?
- 为什么不建议大量使用脚本查询?
- 段合并与 forcemerge 对写入性能的影响
- 集群健康状态 green、yellow、red 表示什么?
- 为什么分片会 unassigned?
- 脑裂如何避免?
- Elasticsearch 选主机制
- 数据库与 Elasticsearch 如何保持一致?
- 如何设计商品搜索?
- 如何设计地理位置搜索?
MongoDB
- MongoDB 适合什么场景?
- 文档、集合、数据库
- ObjectId 的结构
- MongoDB 与关系型数据库的映射
- 基本写入与查询
- 原子性与 upsert
- 索引类型
- 复合索引的最左前缀原则
- explain 与慢查询
- 索引是查询层还是存储引擎层的能力?
- 复制集架构
- 自动故障转移
- 写关注(Write Concern)
- 读偏好(Read Preference)
- 分片集群组成
- 片键选择
- MongoDB 的多文档事务
- 写一致性
- Read Concern(读关注)
- 聚合管道常用阶段
- Change Streams 是什么?
- 核心特性
- 基本用法
- Kafka 的对比
- 典型场景:缓存同步
- WiredTiger 核心特性
- Journal 与 Checkpoint
- 常见慢查询场景
ZooKeeper与注册中心
- ZooKeeper 解决什么问题?
- ZooKeeper 的数据模型是什么?
- ZooKeeper 的一致性保证有哪些?
- ZooKeeper Session 如何工作?
- Watch 机制有什么特点?
- 什么是羊群效应?如何避免?
- ZooKeeper 如何实现公平分布式锁?
- ZooKeeper 如何实现 Leader 选举?
- 临时节点删除是否代表业务实例已经安全退出?
- Curator 客户端与典型用法
- ZAB 的广播流程?
- ZooKeeper 为什么推荐奇数节点?
- Observer 节点有什么作用?
- 注册中心的核心职责是什么?
- 注册中心不可用时,服务还能调用吗?
- Nacos、ZooKeeper、Eureka、etcd、Consul 如何比较?
- 推模式和拉模式如何结合?
- 配置中心和注册中心有什么区别?
- 配置变更如何保证安全?
计算机基础
网络
- IP 四层模型
- TCP 和 UDP 区别
- TCP 三次握手
- 全连接队列
- TCP 四次挥手
- TCP 重传机制
- TCP 流量控制 vs 拥塞控制
- TCP keepalive vs HTTP keep-alive
- TCP 拥塞控制
- 拆包如何解决?
- HTTP 常用状态码
- GET 和 POST 区别
- HTTP 和 HTTPS 区别
- HTTPS 握手过程(TLS 1.2)
- TLS 1.3 握手:为什么只要 1-RTT?
- 证书链怎么验证?中间人为什么伪造不出有效证书?
- 2.0 区别
- 3(QUIC)解决了什么问题?
- 服务端怎么把消息推给浏览器?长轮询、SSE、WebSocket 怎么选?
- DNS 解析流程
- Cookie 和 Session 区别
- Socket、TCP、HTTP 关系
- 打开网页的完整网络过程
- 常见网络攻击
- HTTP 请求报文和响应报文是怎样的?
- 什么是强缓存和协商缓存?它们的工作原理是什么?
- HTTP 头部字段有哪些常见类型?各自作用是什么?
- HTTP 管道化是什么?它解决了什么问题?
- HTTP 多个 TCP 连接怎么实现?
- 网络分层模型的封装与解封装过程是怎样的?
- 数据链路层和网络层各有哪些主要协议?
- ARP 协议是什么?它在网络通信中有什么作用?
- IP 地址和 MAC 地址有什么区别?在网络通信中各自扮演什么角色?
- NAT(网络地址转换)是什么?有什么作用?
- WebSocket 是什么?它在网络通信中有什么作用?
- TCP 连接建立过程中,SYN 洪泛攻击如何发生?如何防范?
- 什么是端口扫描?在网络安全中有什么作用?
- CDN 是什么?它在网络传输中有什么作用?
操作系统
- 用户态和内核态
- 进程、线程、协程区别
- 进程五状态
- 进程间通信方式
- 线程间同步方式
- 进程调度算法
- 死锁四个必要条件
- 银行家算法
- 虚拟内存与物理内存
- 多级页表为什么省内存?TLB miss 有多贵?
- 程序内存布局(低到高)
- 堆和栈区别
- 写时复制(Copy On Write)
- malloc brk vs mmap
- 内存不足时会发生什么
- page cache 与 OOM killer:容器里的 JVM 为什么会无声被杀?
- 页面置换算法
- 中断
- O 模型
- epoll 区别
- epoll ET vs LT
- 零拷贝
- Linux 文件系统(VFS 与 inode)
- 并行和并发有什么区别?
- 什么是孤儿进程和僵尸进程?如何处理?
- 进程的控制块 PCB 包含哪些信息?
- 操作系统的信号机制是什么?有什么作用?
- 介绍一下几种典型的锁?
- PV 操作是什么?在进程同步中如何应用?
- 管程是什么?在操作系统中有什么作用?
- 多级反馈队列调度算法是如何工作的?
- 作业调度和进程调度有什么区别?
- 文件的逻辑结构和物理结构是什么?
- 文件按名存取是如何实现的?
- 文件的目录结构有哪些常见类型?如何实现文件共享?
- 磁盘调度算法有哪些?各有什么特点?
- 什么是 SPOOLING 技术?在操作系统中有什么作用?
- 什么是缓冲区溢出攻击?如何防范?
计算机组成原理
- 冯·诺依曼体系结构与哈佛体系结构的区别是什么?
- 存储程序原理是什么?它对计算机设计有何重要意义?
- 什么是计算机体系结构?它与计算机组成原理有什么关系?
- 计算机中的编码方式有哪些?原码、反码、补码分别是什么?
- 浮点数的表示方法是什么?IEEE 754 标准如何规定?
- 计算机中的移位操作有哪些?各自的作用是什么?
- ALU(算术逻辑单元)的功能和作用是什么?
- 什么是计算机的运算器?它的主要功能是什么?
- 什么是计算机的存储器层次结构?它如何提高存储性能?
- Cache 存储器的作用是什么?如何提高计算机性能?
- Cache 替换策略有哪些?各有什么优缺点?
- SRAM 与 DRAM 的区别是什么?各自应用场景如何?
- 多级存储体系是如何提高系统性能的?
- 什么是虚拟存储器?它如何实现内存的扩充?
- 存储保护的概念是什么?通常采用什么方法实现?
- 机器指令与微指令的区别是什么?
- 指令的寻址方式有哪些?各有什么特点?
- 指令周期与机器周期的区别是什么?
- 什么是计算机的指令系统?它如何影响计算机的性能?
- CPU 中的寄存器有哪些?各自的作用是什么?
- 什么是流水线技术?如何提高 CPU 性能?
- 什么是计算机的并行性?提高并行性的技术有哪些?
- 计算机中的控制器是如何工作的?主要功能是什么?
- 什么是中断?中断的处理过程是怎样的?
- 什么是中断向量表?在中断处理中有什么作用?
- 中断优先级是如何设置的?有什么作用?
- 什么是 DMA 控制器?它如何减轻 CPU 的负担?
- 什么是计算机的通道?它与 DMA 有什么异同?
- 什么是计算机的输入输出系统?主要功能是什么?
- 总线的分类及其功能是什么?
- 什么是同步通信和异步通信?各有什么优缺点?
- 什么是总线仲裁?常见方式有哪些?
- 指令流水线中的结构冒险、数据冒险、控制冒险怎么解决?
- 什么是超标量和乱序执行?
- CPU 和 GPU 的主要区别是什么?
- 计算机中的编码和解码过程是怎样的?
- 什么是计算机的流水线技术?它如何提高 CPU 的性能?
数据结构与算法
- 数组 vs 链表
- 栈 vs 队列
- 常见队列类型
- 用两个栈实现队列
- 平衡二叉树
- 红黑树性质
- 红黑树 vs AVL 树
- 跳表
- 时间轮
- B+ 树 vs B 树 vs 红黑树
- 堆
- 前缀树(Trie)
- LRU 缓存淘汰
- 布隆过滤器
- 哈希表冲突解决
- 排序算法复杂度
- 快排原理
- 归并排序原理
- 排序稳定性
- 外部排序(大数据排序)
- Top-K 问题(找最大前 K 个)
- 二分查找
- DFS vs BFS
- 二叉树遍历
- 链表操作
- 动态规划
- 贪心 vs 动态规划
- 空间复杂度分析
分布式与架构
分布式系统
- 什么是分布式系统?
- 分布式和微服务有什么区别?
- CAP 定理如何理解?
- BASE 理论是什么?
- 一致性哈希为什么需要虚拟节点?
- Redis 分布式锁如何实现?
- Redis 分布式锁有哪些风险?
- 什么是可重入锁和自动续期?
- Redis 锁和 ZooKeeper 锁如何选择?
- 什么是 fencing token?
- Redisson 看门狗(Watchdog)如何实现自动续期?
- RedLock 是什么?为什么有争议?
- 分布式 ID 需要满足什么条件?
- 常见分布式 ID 方案如何选择?
- 雪花算法如何处理时钟回拨?
- Raft 算法解决什么问题?
- Raft 为什么需要多数派?
- Raft 和 Paxos 的区别?
- ZAB 协议是什么?
- 什么是幂等?如何实现?
- 如何设计幂等 Key?
- 最终一致性如何保证?
- 什么是脑裂?
- 什么是拜占庭故障?
- 分布式系统为什么不能依赖本机时间?
系统设计
- 核心设计原则
- 如何设计一个高并发秒杀系统?
- 库存扣减怎么防超卖?三种方案怎么选?
- 高并发下如何保证数据一致性?
- 核心技术栈
- 如何实现亿级别地点库的快速查询?
- 如何实现实时轨迹处理和地理围栏?
- 分布式事务的解决方案?
- Seata AT 模式深度解析
- 如何实现服务限流?
- 服务熔断 vs 服务降级
- 让你设计一个 RPC 框架,怎么设计?
- 让你设计一个短链系统,怎么设计?
- 如何设计一个点赞系统?
- 朋友圈)怎么设计?推模式还是拉模式?
- 让你设计一个分布式 ID 发号器,怎么设计?
- 订单半小时未支付自动取消怎么实现?
- 如果系统的 QPS 突然提升 10 倍,怎么设计应对?
- 大流量网站,单 Redis 无法承压如何解决?
- 如何设计一个可重入的分布式锁?
- 有哪些负载均衡方案?
- 微服务架构是什么?
- 服务网格(Service Mesh)
- 分布式链路追踪(Distributed Tracing)
- 单体项目怎么拆分成微服务架构?
- 对外提供 API 服务,客户说请求接口超时了,怎么排查?
安全认证
- 认证和授权有什么区别?
- RBAC 和 ABAC 的区别?
- 水平越权 vs 垂直越权(IDOR)
- Cookie 和 Session 的区别?
- Session 集群部署如何处理?
- Token 和 Session 如何选择?
- JWT 的结构是什么?
- JWT 验证需要检查什么?
- JWT 有哪些缺点?
- Access Token 和 Refresh Token 如何配合?
- JWT 泄露后怎么办?
- OAuth 2.0 解决什么问题?
- 授权码模式的基本流程?
- PKCE 解决什么问题?
- OAuth 2.0 和 OIDC 的区别?
- 单点登录 SSO 如何实现?
- 单点登出为什么更复杂?
- XSS 是什么?如何防护?
- CSRF 是什么?如何防护?
- SQL 注入如何防护?
- 401 和 403 的区别?
- 密码应该如何存储?
- 签名密钥如何管理?
生产排障
- 线上问题的通用排查流程?
- 如何快速判断问题在哪一层?
- 排障为什么要同时看日志、指标和 Trace?
- Java 进程 CPU 飙高怎么排查?
- 线程池耗尽有什么表现?
- 如何排查死锁?
- 内存持续上涨怎么排查?
- 频繁 Full GC 怎么排查?
- OOM 发生后要保留什么信息?
- 接口突然变慢怎么排查?
- 重试为什么可能放大故障?
- 连接池耗尽怎么处理?
- 慢 SQL 的排查路径?
- Redis 延迟突然上涨怎么排查?
- MQ 消息积压怎么处理?
- 发布后错误率上涨怎么办?
- 什么是有效告警?
- 故障恢复后为什么还要复盘?
工程实践
Linux与工程化
- 常用系统资源命令有哪些?
- Linux load average 是什么?
- Cache 占用高是否代表内存不足?
- 服务端口不通怎么排查?
jps、jstack、jmap、jstat分别做什么?- Arthas 常用能力?
- 镜像和容器的区别?
- Dockerfile 如何优化?
- 容器内存与 JVM 堆如何设置?
- Pod、Deployment、Service 分别是什么?
- readiness 和 liveness probe 的区别?
- Kubernetes 中服务发布的基本过程?
- CD 流水线包含什么?
- 蓝绿发布、滚动发布、金丝雀发布的区别?
- 数据库变更如何兼容灰度发布?
- 如何设计可回滚的发布?
- 日志、指标、Trace 如何分工?
- 服务至少应该监控哪些指标?
- Git 分支策略
- Git 常用操作
Web容器与Nginx
- Servlet 的生命周期是什么?
- Servlet 容器负责什么?
- Filter、Servlet、Interceptor 的执行顺序?
- Tomcat 的核心组件有哪些?
- Tomcat Connector 的请求流程?
- Tomcat 的线程池如何工作?
- Tomcat 出现大量请求排队如何排查?
- Tomcat 类加载机制有什么特点?
- Servlet 异步处理解决什么问题?
- Spring MVC 与 WebFlux 如何选择?
- Nginx 为什么性能高?
- 正向代理和反向代理的区别?
- Nginx 的负载均衡算法有哪些?
- Nginx 如何传递真实客户端 IP?
- 502 和 504 有什么区别?
- 长连接如何配置和排查?
- Nginx 如何实现平滑重载?
- Nginx 限流有哪些思路?
构建与依赖管理
- Maven 的生命周期有哪些?
- 生命周期、Phase、Goal、Plugin 的关系?
package、install、deploy的区别?- Maven 依赖范围有哪些?
- Maven 如何解决依赖冲突?
dependencies和dependencyManagement的区别?- BOM 是什么?
- Maven 聚合和继承有什么区别?
- 多模块项目如何划分?
- Snapshot 和 Release 的区别?
- 什么是可重复构建?
- 为什么不能在不同环境重新构建?
- Maven Wrapper 有什么作用?
- 如何治理依赖漏洞?
- 什么是依赖混淆攻击?
- 为什么不应该使用不受控的动态版本?
- Maven 构建慢怎么优化?
- 是否应该跳过测试加快构建?
测试与代码质量
- 单元测试、集成测试、端到端测试的区别?
- 什么样的代码容易测试?
- 一个好的单元测试包含什么?
- 参数化测试适合什么场景?
- 如何测试异常?
- Mock、Stub、Fake 有什么区别?
- 什么时候不应该 Mock?
- 如何验证外部调用?
@SpringBootTest有什么特点?- 如何测试 Controller?
- 如何测试数据库和中间件?
- 测试覆盖率越高越好吗?
- 如何测试并发代码?
- 如何测试时间相关逻辑?
- 什么是契约测试?
- Code Review 重点看什么?
- 什么是圈复杂度?
- 如何治理技术债?
API设计与接口治理
- 什么是 RESTful API?
- PUT 和 PATCH 的区别?
- API 应该返回统一 200 吗?
- 如何设计稳定的错误码?
- 分页接口如何设计?
- 时间和金额字段如何设计?
- 空值、缺失字段和空集合如何区分?
- 创建接口如何保证幂等?
- 如何防止重复提交?
- 乐观锁如何用于接口更新?
- API 如何做版本管理?
- 如何保证向后兼容?
- 如何下线旧接口?
- API 鉴权通常放在哪些层?
- 开放 API 如何设计签名?
- 如何防止重放攻击?
- API 限流维度有哪些?
- 被限流后应该返回什么?
- 如何设计 API 超时?
- OpenAPI 有什么作用?
- 如何治理接口变更?
- 日志中应该记录哪些 API 信息?
面试
项目经历与场景题
- 如何在 3 分钟内介绍一个项目?
- 面试官为什么会持续追问项目细节?
- 如何回答“你在项目中的贡献是什么”?
- 如何描述一个有说服力的技术难点?
- 如何回答“为什么不用另一种方案”?
- 如何回答“如果重新设计,你会怎么做”?
- 如何介绍一次线上故障?
- 如何区分根因和诱因?
- 复盘应该产出什么?
- 项目成果没有现成指标怎么办?
- 如何证明优化结果可信?
- 如何回答“与同事意见不一致怎么办”?
- 如何回答“需求很急但风险很高怎么办”?
- 如何准备自己的项目问题清单?
领域建模与代码设计
- 常见后端分层如何划分?
- Controller、Service、Manager、DAO 如何分工?
- DTO、DO、VO 是否必须全部存在?
- 什么是限界上下文?
- 实体和值对象的区别?
- 什么是聚合和聚合根?
- Repository 的职责是什么?
- 贫血模型和充血模型的区别?
- 如何避免“巨型 Service”?
- Domain Service 什么时候使用?
- 事务边界应该放在哪里?
- 什么是领域事件?
- 领域事件如何可靠发布?
- 命令和事件有什么区别?
- 什么是防腐层 ACL?
- 微服务之间如何共享模型?
- 如何处理跨上下文业务流程?
- SOLID 如何落地而不是停留在定义?
- 如何判断是否需要设计模式?
- 如何设计状态机?
- 如何建模订单取消?
- 如何建模地理围栏?
- 什么时候不适合使用复杂 DDD?