JAVA BACKEND
Java后端面试题怎么准备?从语言原理到系统证据
Java后端面试通常从语言、并发和JVM逐步进入数据库、缓存、消息队列与系统设计。比背结论更重要的是说明适用条件、失败模式、监控指标,以及你在真实项目中承担了什么。
Java后端面试的回答框架
用“语义—机制—场景—故障—验证”回答技术题。先给出准确含义,再解释运行机制;随后说明何时使用、可能怎样失败,最后给出测试、日志、指标或项目证据。
例如回答线程安全,不要停在“加锁”。应先指出共享可变状态和并发访问,再比较不可变对象、线程封闭、原子变量、锁与并发容器,解释可见性、原子性、活性和性能代价。Oracle并发教程与JLS把内存一致性和happens-before作为关键基础,但具体实现仍要结合当前JDK文档。
重点知识地图
| 层次 | 核心问题 | 常见追问 |
|---|---|---|
| Java语言 | 对象、泛型、异常、集合、反射 | equals/hashCode、类型擦除、不可变性 |
| 并发 | 内存模型、锁、线程池、并发容器 | happens-before、死锁、任务背压 |
| JVM | 内存区域、类加载、GC、诊断 | 泄漏与溢出、停顿、线程与堆分析 |
| 数据层 | 事务、索引、隔离、连接池 | 慢查询、死锁、幂等与一致性 |
| 分布式组件 | 缓存、消息、服务调用 | 击穿、重复消费、超时与重试 |
| 系统设计 | 容量、可靠性、可观测性 | P95、降级、限流、故障恢复 |
并发题怎样避免只背术语?
volatile和synchronized有什么区别?
回答应从问题出发:volatile用于建立特定的可见性和有序性关系,不能把复合读改写操作自动变成原子操作;synchronized通过监视器提供互斥,并建立相应的happens-before关系。选择时要说明共享状态、临界区和竞争程度,而不是只列关键字定义。
线程池参数怎样定?
先区分CPU密集与I/O等待,再结合到达率、单任务耗时、下游容量、队列长度和延迟目标。必须说明拒绝策略、监控、超时和优雅关闭。固定公式只能作为初始估计,最终要压测并观察队列、活跃线程和下游错误。
死锁怎么查?
确认线程是否长期等待,获取线程转储查看锁持有与等待关系,再定位不一致的加锁顺序或跨资源事务。修复可包括统一锁顺序、缩小临界区、超时或减少嵌套;不能简单靠增加线程数。
JVM问题怎样连接到线上诊断?
- 先描述症状:延迟上升、吞吐下降、CPU高、内存增长、频繁GC或进程退出。
- 检查时间相关的指标、GC日志、线程和堆信息,避免只看一次快照。
- 区分堆内对象、线程、直接内存、类元数据和本地资源。
- 建立假设后用负载、采样或最小复现验证。
- 修改配置或代码后回归延迟、吞吐和资源占用。
GC选择与参数依赖JDK版本、堆大小、分配速率和停顿目标。面试时先声明版本与工作负载,再讨论吞吐、停顿和内存之间的取舍,不要声称某个收集器适合所有系统。
数据库、缓存和消息队列常见追问
| 问题 | 回答重点 | 验证方式 |
|---|---|---|
| 索引为什么没用 | 查询条件、选择性、统计信息、排序与回表 | 执行计划和真实数据分布 |
| 事务隔离怎么选 | 异常类型、一致性要求、锁与吞吐 | 并发测试和数据库文档 |
| 缓存与数据库不一致 | 更新顺序、失效、重试和容忍窗口 | 故障注入与对账 |
| 消息重复消费 | 投递语义、幂等键、事务边界 | 重复投递和崩溃恢复测试 |
| 调用雪崩 | 超时、重试放大、隔离、限流和降级 | 依赖故障与容量压测 |
系统设计没有脱离约束的标准答案。先问QPS、数据规模、一致性、延迟和可用性目标,再画核心链路与数据流,最后讨论瓶颈、故障和演进。
项目经历怎样讲出后端深度?
使用项目经历结构说明背景和职责后,重点讲一个你真正做过的技术决策:基线有什么问题、有哪些候选方案、为什么选择当前方案、如何上线、如何监控、结果怎样核对、还有什么遗留风险。不要把团队成果全部写成个人成果,也不要编造QPS、延迟或节省比例。
版本与经验边界:Java语言、JVM和框架会演进。回答前说明使用的JDK、数据库和组件版本;本文提供准备框架,不替代对应版本的官方文档,也不代表特定公司的题库。
常见问题
需要把Spring源码都背下来吗?
通常更重要的是理解依赖注入、事务边界、代理、请求链路和失败行为,并能结合实际版本定位问题。源码可用于验证理解,不应替代场景分析。
八股题怎么准备更有效?
每个结论补三个追问:为什么、什么时候不适用、怎样验证。再把它连接到一个真实项目或最小实验。
系统设计应该先画什么?
先澄清目标和容量,再画用户请求、核心服务、数据存储和外部依赖;之后补缓存、异步、扩展、监控和故障路径。
没有高并发经验怎么办?
如实说明规模,展示你对容量估算、瓶颈、压测和风险的推理。不要把测试环境或理论估计说成线上结果。
来源与适用范围
并发基础参考 Oracle Java并发教程;内存模型与happens-before参考 Java Language Specification第17章;当前JDK工具、JVM与GC入口参考 JDK 25官方文档。教程可能对应较早JDK,具体行为应以项目版本规范为准;来源与面试稳不存在合作关系。