1. Java面试题目技术文档概述
Java作为企业级应用开发的主流语言,其技术面试一直是开发者职业发展的重要关卡。这份文档不同于市面上常见的面试题简单罗列,而是从实际工程角度出发,结合近三年一线互联网企业的真实面试案例,整理出既考察基础又贴近实战的题目体系。我参与过数百场Java技术面试,发现很多候选人在面对"HashMap扩容机制"这类经典问题时,往往只能背诵标准答案,却说不清楚为什么默认负载因子是0.75而不是其他值。这正是我们需要深入探讨的技术本质。
2. Java基础核心考点解析
2.1 JVM内存模型与GC机制
以HotSpot虚拟机为例,堆内存划分不仅仅是年轻代、老年代的概念记忆。在阿里云ECS的实践案例中,我们通过-XX:NewRatio=2参数调整新生代与老年代比例时,需要同时考虑应用的对象分配速率和晋升阈值。比如电商秒杀系统需要更大的年轻代空间来应对瞬时对象创建,而ERP系统则可能需要调大老年代占比。
关键提示:面试时被问到CMS和G1区别时,不要简单回答"一个分代一个不分代",而要从停顿时间、内存碎片、并发阶段等维度对比,最好能举例说明你在压力测试中观察到的GC日志差异。
2.2 并发编程实战要点
synchronized的锁升级过程(偏向锁→轻量级锁→重量级锁)需要结合对象头Mark Word结构来解释。在美团外卖的订单系统中,我们通过JOL工具发现,当QPS超过5000时,大量锁会直接膨胀为重量级锁,此时改用ReentrantLock配合tryLock能提升15%的吞吐量。
常见坑点:
ThreadLocal使用后未remove导致内存泄漏(尤其在线程池场景)volatile不能保证原子性(如i++操作)ConcurrentHashMap的size()方法返回值不精确
3. 框架层深度考察指南
3.1 Spring循环依赖解决方案
三级缓存(singletonFactories、earlySingletonObjects、singletonObjects)的运作机制需要能画出时序图。在京东库存系统改造时,我们遇到构造器注入导致的循环依赖问题,最终通过@Lazy注解延迟初始化解决。面试时要能说清楚:
- 为什么字段注入能解决而构造器注入不行
- Spring Boot自动配置的@Conditional条件判断逻辑
- Bean生命周期中BeanPostProcessor的执行时机
3.2 MyBatis缓存陷阱
一级缓存(SqlSession级别)在分布式环境下可能引发脏读。某金融项目曾因开发者在循环中频繁调用同一查询但未清空缓存,导致数据显示异常。解决方案包括:
java复制// 方案1:手动清空缓存
sqlSession.clearCache();
// 方案2:配置flushCache=true
@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Select("SELECT * FROM user WHERE id=#{id}")
User getUserById(Integer id);
4. 分布式场景难题突破
4.1 分布式锁实现对比
在拼多多秒杀系统中,我们对比过三种方案:
- Redis SETNX:需要处理锁续期和原子性释放问题
- Zookeeper临时节点:性能较差但可靠性高
- 数据库乐观锁:适合冲突少的场景
最终采用Redisson的看门狗机制实现自动续期,关键配置参数:
properties复制# 锁超时时间(毫秒)
lockWatchdogTimeout=30000
# 获取锁等待时间(毫秒)
waitTime=5000
4.2 分布式事务实践
Seata的AT模式与TCC模式选择标准:
- AT模式:对代码侵入小,适合普通转账类业务
- TCC模式:需要实现try/confirm/cancel,适合库存冻结等复杂场景
在携程酒店预订系统中,我们通过TCC模式解决跨服务房间库存管理问题,关键是要保证各阶段的幂等性。
5. 性能优化实战案例
5.1 JVM参数调优模板
根据应用类型推荐基础配置:
bash复制# 电商高并发系统
-Xms4g -Xmx4g -XX:NewRatio=1 -XX:SurvivorRatio=8
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
# 大数据处理系统
-Xms8g -Xmx8g -XX:NewRatio=3 -XX:+UseParallelGC
-XX:ParallelGCThreads=8
5.2 SQL优化黄金法则
- 索引失效的六大场景(最左前缀、函数计算、类型转换等)
- Explain执行计划解读要点
- 分页查询优化:不要用
limit 100000,10,改为:
sql复制SELECT * FROM user WHERE id > last_id ORDER BY id LIMIT 10
6. 设计模式落地实践
6.1 策略模式在风控系统中的应用
某银行反欺诈系统通过策略模式实现不同风险等级的检测规则:
java复制public interface RiskStrategy {
RiskLevel evaluate(User user);
}
@Service
@RiskType("HIGH")
public class HighRiskStrategy implements RiskStrategy {
// 实现具体检测逻辑
}
6.2 观察者模式实现事件驱动
使用Spring Event实现订单状态变更通知:
java复制// 定义事件
public class OrderEvent extends ApplicationEvent {
private String orderNo;
// 构造方法...
}
// 发布事件
applicationContext.publishEvent(new OrderEvent(this, orderNo));
// 监听处理
@Component
public class SMSListener {
@EventListener
public void handleEvent(OrderEvent event) {
// 发送短信逻辑
}
}
7. 高频系统设计题解析
7.1 短链生成系统设计
需要考虑的要点:
- 62进制转换算法(长链→短码)
- 布隆过滤器防重复
- Redis缓存热点数据
- 分段锁优化并发写入
核心代码片段:
java复制// 进制转换
public static String encode(long num) {
StringBuilder sb = new StringBuilder();
while (num > 0) {
sb.append(CHAR_SET[(int)(num % 62)]);
num /= 62;
}
return sb.reverse().toString();
}
7.2 秒杀系统架构要点
三级缓存架构实践:
- 本地缓存(Caffeine):预热热点商品数据
- Redis集群:库存扣减和分布式锁
- 数据库最终一致性:通过MQ异步落库
限流策略组合:
- 网关层令牌桶限流
- 服务层Semaphore控制并发线程数
- 分布式限流Redis+Lua脚本
8. 代码审查重点项清单
根据Google Java代码规范整理的必查项:
- 异常处理:
- 禁止捕获Throwable
- 业务异常要有明确错误码
- 日志规范:
- 参数必须用占位符
log.info("order {} created", orderId) - ERROR级别要带上下文信息
- 参数必须用占位符
- 集合使用:
- 初始化指定容量
new ArrayList<>(100) - 使用Collections.unmodifiableList返回不可变集合
- 初始化指定容量
9. 压力测试实战手册
JMeter测试关键配置:
xml复制<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="高并发测试">
<intProp name="ThreadGroup.num_threads">500</intProp>
<intProp name="ThreadGroup.ramp_time">60</intProp>
<longProp name="ThreadGroup.duration">300</longProp>
</ThreadGroup>
监控指标阈值参考:
- CPU使用率 ≤70%
- GC停顿时间 ≤200ms/次
- 平均响应时间 ≤1s
- 错误率 ≤0.1%
10. 前沿技术考察趋势
近年来大厂新增考点:
- GraalVM原生镜像编译
- 反射配置要点
- 资源文件特殊处理
- 云原生Java实践
- Kubernetes探针配置
- 服务网格集成
- 响应式编程
- WebFlux背压处理
- R2DBC连接池配置
在准备面试时,建议用Arthas进行线上问题诊断实战,比如用watch命令监控方法参数返回值,用jad命令反编译可疑代码。这些实操经验往往能让面试官眼前一亮。
