2025年Java高级工程师面试题
JVM性能调优
1. 内存溢出问题排查
问题:如何快速定位和解决Java堆内存溢出?
答案:
- 诊断工具:
jmap -dump:format=b,file=heap.hprof <pid> jhat -port 7000 heap.hprof
- 常见原因:
- 大对象未释放
- 内存泄漏(静态集合类)
- 不合理的GC配置
2. G1垃圾收集器调优
问题:如何优化G1收集器减少Full GC?
答案:
- 关键参数:
-XX:G1HeapRegionSize=32m -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45
- **监控命令】
jstat -gcutil <pid> 1000
高并发编程
1. 线程池优化
问题:如何设计适合IO密集型任务的线程池?
答案:
- 参数配置:
new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors() * 2, 200, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000), new CustomThreadFactory() );
- 监控指标:
- 活跃线程数
- 队列堆积情况
2. 并发工具应用
问题:如何用CompletableFuture优化异步编程?
答案:
- 链式调用:
CompletableFuture.supplyAsync(() -> fetchData()) .thenApply(data -> process(data)) .exceptionally(ex -> handleError(ex));
- 组合操作:
- allOf()/anyOf()
- thenCombine()
分布式系统
1. 分布式锁实现
问题:对比Redis和Zookeeper实现分布式锁的优劣?
答案:
特性 | Redis | Zookeeper |
---|---|---|
性能 | 高(10w+ QPS) | 中(1w+ QPS) |
可靠性 | 依赖持久化 | 基于Zab协议强一致 |
实现复杂度 | 简单(setnx) | 需要处理临时节点 |
2. 微服务治理
问题:如何设计服务熔断降级策略?
答案:
- 熔断规则:
- 错误率阈值(50%)
- 最小请求数(20次/分钟)
- 降级方案:
- 默认返回值
- 缓存兜底数据
数据库优化
1. MySQL索引优化
问题:如何优化千万级数据表的查询性能?
答案:
- 索引设计:
ALTER TABLE orders ADD INDEX idx_comp (user_id, status, create_time);
- 查询优化:
- 避免SELECT *
- 使用覆盖索引
2. 分库分表实践
问题:如何选择分片键和分片策略?
答案:
- 分片键选择:
- 高区分度字段
- 避免热点问题
- 分片策略:
- 范围分片(适合时间字段)
- 哈希分片(均匀分布)