
1. 面试全貌与核心考察维度作为经历过数十场Java全栈面试的老油条我深刻理解面试官真正想考察的是什么。不同于网上那些零散的面试题集合今天我想从面试官视角拆解Java全栈岗位的完整能力模型。去年我作为技术面试官参与了公司春季招聘筛选了200份简历最终面谈了37位候选人。这个过程中发现能系统掌握以下四个维度的候选人不足20%基础功底看似简单的HashMap实现原理能完整说出拉链法红黑树优化的不超过30%框架理解90%的候选人会用Spring Boot但能解释自动配置原理的不到一半实战能力现场编码时能正确处理并发问题的凤毛麟角工程素养Git操作规范、单元测试覆盖率等细节往往成为区分中级与高级的关键2. 基础篇那些被低估的Java核心2.1 JVM深度考察实录面试官最常挖的JVM问题往往从这段代码开始public class HeapOOM { static class OOMObject {} public static void main(String[] args) { ListOOMObject list new ArrayList(); while (true) { list.add(new OOMObject()); } } }高频追问路线这段代码会导致什么异常98%能答出OOM发生在哪个内存区域70%能说出堆内存如何用参数限制堆大小50%知道-Xmx为什么Full GC后还是OOM30%能提到强引用如何用MAT分析dump文件能实操的不足10%避坑指南不要死记参数要理解新生代/老年代比例对GC的影响准备一个真实的MAT分析案例比如查出是某个静态Map导致的内存泄漏最新ZGC的特性要了解虽然生产环境用得少但面试常问2.2 并发编程实战陷阱看这个简单的双重检查锁public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }致命问题指令重排可能导致返回未初始化完成的实例。正确的解法应该用volatile修饰instance变量但更优雅的方式是使用枚举实现public enum Singleton { INSTANCE; // 其他方法... }面试现场发现80%的候选人能写出双重检查锁但能解释清楚指令重排影响的不到40%知道枚举写法的约20%。3. 框架篇Spring全家桶深度解析3.1 Spring Boot自动配置魔法被问烂的问题SpringBootApplication做了什么 标准答案三件套Configuration标记配置类ComponentScan包扫描EnableAutoConfiguration核心魔法但高手应该能继续深挖自动配置条件判断原理Conditional系列注解spring.factories文件的作用机制如何自定义Starter演示一个简单的日志Starter实战技巧 准备一个自己实现的Starter项目现场展示自动配置类编写规范spring.factories文件位置条件注解的实际应用场景3.2 MyBatis缓存踩坑实录这个查询有什么问题Select(SELECT * FROM users WHERE id #{id}) Options(flushCache Options.FlushCachePolicy.TRUE) User getUserById(int id);问题分析一级缓存SqlSession级别默认开启频繁更新的数据应该禁用缓存分布式环境下需要处理二级缓存一致性优化方案Select(SELECT * FROM users WHERE id #{id}) Options(useCache false) User getRealTimeUser(int id);4. 实战篇系统设计高频考题4.1 秒杀系统设计要点去年面试中最常考的系统设计题核心考察点如何解决超卖问题乐观锁version字段Redis原子操作DECRWATCH流量削峰方案令牌桶算法实现队列缓冲RabbitMQ死信队列处理超时热点数据隔离Redis分片存储本地缓存推拉结合更新避坑提醒不要一上来就说用Redis先明确QPS预期库存扣减和订单创建要分开处理准备好压测数据比如JMeter测试报告4.2 分布式ID生成方案对比现场手写Snowflake实现是常见考题要注意public class SnowflakeIdWorker { private final long twepoch 1288834974657L; private final long workerIdBits 5L; private final long datacenterIdBits 5L; // 其他成员变量... public synchronized long nextId() { long timestamp timeGen(); if (timestamp lastTimestamp) { throw new RuntimeException(时钟回拨异常); } // 核心算法实现... } }常见追问如何处理时钟回拨记录上次时间戳抛出异常workerId怎么分配ZooKeeper顺序节点有没有更简单的方案美团Leaf的优化方案5. 工程素养看不见的竞争力5.1 Git操作规范检查面试官可能会让你解释git rebase -i HEAD~3这个命令的作用是什么如何用git bisect排查问题加分项准备一个真实的git log展示规范的commit message演示用rebase整理提交历史的操作知道.git/hooks的用法比如pre-commit检查5.2 单元测试覆盖率陷阱看这个测试用例Test public void testTransfer() { Account a new Account(100); Account b new Account(0); a.transfer(b, 50); assertEquals(50, a.getBalance()); }缺失的断言没有验证b的余额变化没有测试异常情况如余额不足缺少并发场景测试最佳实践使用Jacoco生成覆盖率报告Mock外部依赖比如用Mockito模拟数据库参数化测试JUnit 5的ParameterizedTest6. 行为面试技术人的软实力6.1 故障排查思维考察典型问题线上CPU突然飙升到90%如何排查标准回答框架确认现象监控系统查看时间点定位进程top -Hp线程分析jstack找热点内存检查jmapjhat代码回溯git blame高阶技巧准备Arthas的实际使用案例知道如何用火焰图分析性能了解Linux perf工具的基本用法6.2 技术选型思考题为什么选择RabbitMQ而不是Kafka对比维度消息可靠性confirm机制vs副本数吞吐量万级vs百万级延迟毫秒级vs秒级运维成本集群规模回答技巧结合业务场景比如电商订单适合RabbitMQ提到Pulsar等新技术的调研结论展示压测数据支撑观点7. 终极备战清单根据我的面试官经验最后分享几个实用建议知识体系脑图用XMind整理Java全栈知识图谱重点标注自己的薄弱环节手写代码本准备20个必须能手写的算法和设计模式比如LRU缓存实现项目亮点卡为每个项目准备3个技术亮点和2个改进点模拟面试找同行进行至少3次全真模拟录制视频回看肢体语言技术趋势准备对Java新特性如虚拟线程的看法记住面试是双向选择当面试官追问你还有什么问题时可以问团队目前在解决的技术挑战是什么公司的技术演进路线是怎样的这个岗位的成长路径有哪些这些问题的质量往往能决定最终offer的级别。