1. 项目概述:Java大厂面试核心考点全景
作为深耕Java技术栈多年的面试官,我整理出这份覆盖主流互联网公司技术考察要点的实战指南。不同于市面上零散的面试题集合,本文将围绕Spring全家桶、JVM、并发编程和微服务架构四大核心模块,结合大厂真实面试场景,揭示技术考察背后的底层逻辑和深度追问方向。
在头部互联网企业的技术面试中,面试官通常会采用"知识点追问->原理剖析->场景应用->故障排查"的递进式考察路径。比如当谈到Spring循环依赖时,不会停留在@Autowired用法的层面,而是会深入到三级缓存的工作机制,进而延伸到设计模式的应用,最后可能给出一个具体的高并发场景要求候选人分析解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring全家桶深度解析
2.1 Spring Framework核心机制
三级缓存解决循环依赖的完整流程:
- 实例化阶段:创建Bean的原始对象,放入三级缓存(singletonFactories)
- 属性注入阶段:发现依赖其他Bean时,从缓存中获取早期引用
- 初始化阶段:完成全部依赖注入后,将成熟Bean放入一级缓存
重要提示:Spring 5.2之后对缓存机制进行了优化,当出现构造器循环依赖时会直接抛出BeanCurrentlyInCreationException,这是面试中容易忽略的细节。
动态代理的选型策略:
- JDK动态代理:基于接口实现,生成$Proxy0类,执行效率较高
- CGLIB:通过继承方式实现,生成Enhancer子类,适用于无接口场景
- 性能对比:在Spring Boot 2.x默认配置下,CGLIB的启动时间比JDK代理长约15-20%
2.2 Spring Boot自动配置原理
条件装配的典型应用场景:
- @ConditionalOnClass:当类路径存在指定类时生效
- @ConditionalOnMissingBean:容器中不存在指定Bean时生效
- @ConditionalOnProperty:配置文件中存在指定属性时生效
自动配置加载顺序控制:
- 通过spring.autoconfigure.exclude显式排除
- 利用@AutoConfigureOrder指定顺序(数值越小优先级越高)
- 自定义配置类使用@AutoConfigureAfter指定依赖关系
2.3 Spring Cloud微服务组件
服务注册发现的演进路线:
- Eureka 1.x:AP模型,适合服务发现场景
- Nacos:支持CP/AP模式切换,配置管理一体化
- Consul:强一致性的CP模型,支持健康检查
分布式配置中心对比:
| 特性 | Spring Cloud Config | Nacos | Apollo |
|---|---|---|---|
| 实时推送 | 需要Bus组件 | 原生支持 | 原生支持 |
| 版本管理 | Git原生支持 | 支持 | 完善 |
| 权限控制 | 依赖Git仓库 | 基础 | 完善 |
| 多环境支持 | 通过profile实现 | 命名空间 | 集群+环境 |
3. JVM原理与性能调优
3.1 内存模型深度剖析
对象内存布局示例(64位JVM,默认压缩指针):
- 对象头:12字节(Mark Word 8字节 + Klass Pointer 4字节)
- 实例数据:根据字段类型计算
- 对齐填充:保证对象大小是8字节的整数倍
垃圾收集器选型策略:
- 低延迟场景:ZGC(JDK15+生产可用)或Shenandoah
- 高吞吐场景:G1(JDK9+默认)或Parallel Scavenge
- 小内存应用:Serial + Serial Old
3.2 线上故障排查实战
内存泄漏定位四步法:
- jmap -histo:live [pid] 查看对象分布
- jmap -dump:format=b,file=heap.hprof [pid] 导出堆转储
- MAT分析支配树,定位异常对象引用链
- 结合代码审查确定泄漏点
CPU飙高排查案例:
bash复制# 1. 找出CPU占用高的线程
top -H -p [pid]
# 2. 转换线程ID为十六进制
printf "%x" [tid]
# 3. 查看线程堆栈
jstack [pid] | grep -A 20 [nid]
4. 并发编程实战精要
4.1 Java内存模型(JMM)
happens-before八大原则:
- 程序顺序规则
- 监视器锁规则
- volatile变量规则
- 线程启动规则
- 线程终止规则
- 线程中断规则
- 对象终结规则
- 传递性
4.2 并发工具类实战
ThreadLocal使用陷阱:
- 内存泄漏:必须配合try-finally清理
- 线程池污染:线程复用导致数据错乱
- 解决方案:使用阿里巴巴TransmittableThreadLocal
并发容器性能对比:
| 操作 | HashMap | ConcurrentHashMap | Hashtable |
|---|---|---|---|
| get | O(1) | O(1) | O(1) |
| put | O(1) | 分段锁竞争 | 全局锁 |
| 扩容 | 全表锁 | 分段扩容 | 全表锁 |
5. 微服务架构设计要点
5.1 服务治理实践
熔断器配置黄金法则:
yaml复制circuitBreaker:
failureRateThreshold: 50 # 触发熔断的失败率阈值
minimumNumberOfCalls: 20 # 最小统计请求数
slidingWindowSize: 10s # 统计时间窗口
waitDurationInOpenState: 30s # 半开状态等待时间
5.2 分布式事务方案
Seata AT模式执行流程:
- TM向TC发起全局事务
- RM注册分支事务,执行业务SQL
- RM生成undo log并上报TC
- 全局提交/回滚时,TC协调各RM完成对应操作
性能优化建议:
- 避免长事务(控制在1秒内)
- 热点数据使用本地事务+异步补偿
- 读操作使用@GlobalLock注解
6. 面试实战技巧
技术深度考察应对策略:
- 原理类问题:采用"表面现象->底层实现->设计思想"三层应答法
- 场景设计题:先确认约束条件,再提出多种方案比较
- 故障排查题:展示系统化思维,从监控指标到根因分析
高频陷阱问题解析:
- "HashMap在多线程环境下会出现什么问题?"
标准回答应包含:死链形成过程、rehash机制、替代方案 - "Young GC频繁可能是什么原因?"
需要分析:对象分配速率、Survivor区大小、年龄阈值设置
在最近一次大厂技术面中,候选人被要求设计一个秒杀系统。优秀的回答应当涵盖:
- 流量削峰(队列缓冲+异步化)
- 热点隔离(本地缓存+Key分片)
- 库存一致(Redis Lua+分布式锁)
- 降级预案(静态化降级+熔断机制)
建议准备技术面试时,针对每个核心知识点准备三个层次的回答:
- 基础用法(What)
- 实现原理(How)
- 设计思想(Why)
