Java开发工程师(5年以上经验)面试题集
本文系统梳理了Java高级工程师面试的核心技术要点,涵盖七大领域:1)JVM性能调优与内存管理(8题),包括OOM排查、GC选型、内存泄漏等;2)并发编程实战(9题),涉及AQS源码、线程池调优、分布式锁等;3)分布式系统设计(10题),包含分布式事务、服务治理、链路追踪等;4)中间件原理(7题),深度解析Redis、Kafka、MySQL等;5)Spring源码(6题),剖析自动配置、循环依赖等
一、JVM性能调优与内存管理(8题)
1. 生产环境OOM排查与调优
题目:某天凌晨2点,你的线上服务突然出现频繁的Full GC,CPU飙升,部分接口超时。请详细描述你的排查思路、使用什么工具、如何定位问题根源,并给出具体的优化方案。
考察点:JVM内存模型、GC日志分析、MAT/JProfiler使用、OOM分类与处理
2. G1与ZGC选型实战
题目:你们系统从CMS升级到G1,又从G1尝试ZGC,请对比这三种垃圾回收器的适用场景。在什么业务场景下你会选择ZGC?线上如何配置G1的参数(如-XX:MaxGCPauseMillis、-XX:G1HeapRegionSize)来达到最优效果?
考察点:GC算法原理、参数调优、业务场景匹配
3. 内存泄漏案例复现与修复
题目:你遇到过ThreadLocal导致的内存泄漏吗?请解释ThreadLocal的实现原理,为什么会导致内存泄漏?如何避免?如果在线上已经发生了,如何快速定位和修复?
考察点:ThreadLocal源码、弱引用、内存泄漏排查
4. 类加载机制与热部署
题目:你们项目中使用过自定义类加载器吗?请结合Tomcat的类加载机制,解释为什么多个Web应用可以部署在同一个Tomcat中而不会类冲突?如果让你实现一个简单的热部署功能,你会怎么设计?
考察点:双亲委派模型、破坏双亲委派的场景、Tomcat类加载器架构
5. 堆外内存使用与回收
题目:Netty中大量使用堆外内存(DirectBuffer),为什么?堆外内存的回收机制是怎样的?如果堆外内存泄漏,你如何排查?(提示:通过-XX:MaxDirectMemorySize、jstat、pmap等工具)
考察点:DirectBuffer原理、NIO、内存回收机制
6. JIT编译优化
题目:解释一下JVM的即时编译(JIT)过程。什么是热点代码?如何触发编译?你了解分层编译(Tiered Compilation)吗?在什么情况下你会关闭某些编译优化?
考察点:JIT原理、C1/C2编译器、编译优化
7. 对象分配与逃逸分析
题目:解释JVM的逃逸分析技术。它如何影响对象的堆上分配?标量替换和栈上分配是什么?请举例说明什么情况下会触发逃逸分析,以及它对性能的实际影响。
考察点:逃逸分析、栈上分配、标量替换
8. 跨代引用与卡表
题目:解释JVM中的卡表(Card Table)和记忆集(Remembered Set)的作用。为什么需要它们?在G1垃圾回收器中,RSet是如何维护的?跨代引用扫描是如何优化的?
考察点:GC算法细节、跨代引用处理
二、并发编程与高并发实战(9题)
9. AQS源码级解析
题目:请详细说明AbstractQueuedSynchronizer(AQS)的核心设计思想。以ReentrantLock为例,解释非公平锁和公平锁的实现差异。CLH队列是如何工作的?Condition的实现原理是什么?
考察点:AQS源码、锁机制、条件队列-6
10. 线程池动态调优
题目:你们项目中的线程池参数是如何设置的?如果线上流量突然暴涨,如何在不重启服务的情况下动态调整线程池参数?(提示:ThreadPoolExecutor提供的set方法)你如何监控线程池的运行状态?什么情况下会触发拒绝策略?
考察点:线程池参数设计、动态调优、监控告警-6
11. 分布式锁的演进与选型
题目:从单机synchronized到Redis分布式锁,再到Redisson和ZooKeeper锁,请对比它们的优缺点和适用场景。你在项目中是如何实现分布式锁的?遇到过哪些坑(如锁超时、可重入、锁误删)?如何解决?
考察点:分布式锁原理、Redisson看门狗、ZooKeeper顺序节点-10
12. 虚拟线程(Virtual Threads)实践
题目:Java 21正式引入了虚拟线程,你们项目是否尝试过?对比传统平台线程,虚拟线程在高并发IO场景下有哪些优势?使用虚拟线程时需要注意什么?为什么说虚拟线程不适合CPU密集型任务?
考察点:虚拟线程原理、M:N调度模型、适用场景-6
13. CompletableFuture与响应式编程
题目:你们项目中如何实现异步编程?对比Future、CompletableFuture和响应式编程(Project Reactor/RxJava)的异同。请写一段代码,展示如何使用CompletableFuture实现多个异步任务的并行执行和结果聚合(如查询多个服务后组装结果)。
考察点:异步编程模型、CompletableFuture API、响应式流
14. 并发容器选型与源码分析
题目:ConcurrentHashMap在JDK 7和JDK 8中的实现有什么重大变化?为什么JDK 8要放弃分段锁?ConcurrentHashMap的size()方法是如何计算的?在多线程环境下,如何选择合适的并发容器(如CopyOnWriteArrayList、ConcurrentLinkedQueue)?
考察点:ConcurrentHashMap源码、并发容器特性
15. 限流算法落地实现
题目:手写一个基于令牌桶算法的限流器(RateLimiter)。对比Guava的RateLimiter和Sentinel的限流实现。你们项目中如何设计接口级别的限流策略?如何动态配置限流阈值?
考察点:限流算法、Guava RateLimiter源码、Sentinel原理-2
16. 伪共享(False Sharing)与缓存行填充
题目:解释什么是CPU缓存伪共享?在多线程编程中如何避免?Java中提供了@Contended注解,它的作用是什么?使用时会有什么限制?请举例说明伪共享对性能的实际影响。
考察点:CPU缓存结构、缓存行、伪共享优化
17. 生产者-消费者模式的多种实现
题目:请用至少三种方式实现生产者-消费者模式(如BlockingQueue、wait/notify、Condition、Disruptor)。对比它们的优缺点。在高并发场景下,你会选择哪种?为什么?
考察点:线程通信、Disruptor无锁队列、性能对比
三、分布式系统与微服务架构(10题)
18. 分布式事务方案选型
题目:在订单系统中,下单需要扣减库存、优惠券、增加积分等多个服务调用,你会选择哪种分布式事务方案?对比XA(2PC)、TCC、Saga、本地消息表的适用场景和优缺点。Seata的AT模式是如何实现的?有哪些坑?
19. 服务发现与治理选型
题目:你们为什么选择Nacos而不是Eureka或Consul?Nacos的AP和CP模式分别对应什么场景?如何设计一个高可用的服务注册中心?服务下线时,如何保证调用方及时感知?(涉及心跳机制、主动下线通知、健康检查等)
考察点:CAP理论、Nacos原理、服务健康检查-7
20. 全链路压测与容量评估
题目:双11大促前,你们如何进行全链路压测?压测过程中如何保证不影响线上真实用户?如何评估系统的容量水位?如果压测发现某个服务成为瓶颈,你有哪些扩容或优化的手段?
考察点:全链路压测设计、影子库、流量隔离、弹性伸缩
21. 接口幂等性设计
题目:支付系统中最怕重复支付,如何设计幂等接口?幂等方案有哪些(数据库唯一索引、Redis分布式锁、状态机)?如果使用Redis做幂等,需要考虑哪些问题(如Redis集群一致性、key过期时间)?
考察点:幂等性设计、防重方案、分布式场景陷阱
22. 配置中心动态刷新原理
题目:Spring Cloud Config或Nacos配置中心是如何实现配置的动态刷新的?@RefreshScope的工作原理是什么?(涉及Bean动态刷新、作用域代理等)如果配置变更后,某些Bean需要执行回调逻辑,如何实现?
考察点:配置中心原理、Spring Bean生命周期、动态代理
23. 服务熔断与降级实战
题目:Sentinel和Hystrix的熔断机制有什么区别?Sentinel的滑动窗口是如何实现的?你们项目中如何设计降级策略?什么情况下会触发熔断?熔断恢复后,如何防止雪崩?
考察点:熔断器模式、滑动窗口算法、降级策略设计-7
24. 链路追踪与故障定位
题目:你们使用什么链路追踪系统(SkyWalking、Zipkin、Jaeger)?TraceId是如何跨服务传递的?如果线上出现慢调用,如何快速定位是哪个环节导致的?你了解采样策略吗?如何在不影响性能的前提下保证关键链路全采样?
考察点:分布式追踪原理、Span设计、采样策略
25. 分库分表中间件选型
题目:你们为什么选择ShardingSphere而不是MyCat?ShardingSphere的读写分离和分库分表是如何实现的?分库分表后,如何支持按非分片键的查询?(涉及索引表、ES异构、基因法)
考察点:分库分表原理、ShardingSphere源码、查询优化-2
26. 分布式ID生成方案
题目:分布式环境下,如何生成全局唯一的ID?对比UUID、雪花算法(Snowflake)、数据库号段模式的优缺点。雪花算法如果发生时钟回拨怎么办?你们项目中有没有遇到过ID重复的问题?如何解决的?
考察点:分布式ID方案、雪花算法原理、时钟回拨处理-1
27. 配置与元数据中心设计
题目:如果让你设计一个支持多环境、多集群、动态推送的配置中心,你会如何设计?如何保证配置下发的一致性?如何保证高可用?(可以参考Nacos、Apollo的架构设计)
考察点:配置中心架构、长轮询机制、数据一致性
四、中间件源码级理解(7题)
28. Redis线程模型与IO多路复用
题目:Redis为什么是单线程却这么快?它的IO多路复用模型是如何实现的?(涉及epoll、select)Redis 6.0引入了多线程IO,解决了什么问题?在使用Redis时,如何避免big key、hot key问题?
考察点:Redis线程模型、IO多路复用、性能优化
29. Redis集群数据倾斜与迁移
题目:Redis Cluster的哈希槽(hash slot)是如何分配的?当新增或删除节点时,数据迁移过程是怎样的?迁移过程中如果客户端访问正在迁移的key,如何处理?你们遇到过数据倾斜吗?如何解决?
考察点:Redis Cluster原理、数据迁移、reshard过程
30. Kafka消息可靠性保障
题目:Kafka如何保证消息不丢失?从生产者、Broker、消费者三个维度详细说明。acks=all、min.insync.replicas、 unclean.leader.election.enable这些参数分别起什么作用?如果Kafka集群出现消息积压,如何排查和解决?
考察点:Kafka可靠性、ISR机制、消息积压处理-3
31. Kafka顺序消费与重平衡
题目:Kafka如何保证分区内的消息顺序?如果消费者组发生重平衡(Rebalance),对顺序消费有什么影响?如何优化Rebalance的时间?你们遇到过Rebalance导致的消费延迟吗?
考察点:Kafka分区机制、Rebalance原理、消费者协调器
32. RocketMQ事务消息实现
题目:RocketMQ的事务消息是如何实现的?请解释半消息(Half Message)和消息回查机制。对比Kafka,RocketMQ在事务消息方面的优势是什么?在什么场景下你会选择事务消息?
考察点:RocketMQ事务消息、消息回查、分布式事务
33. MySQL MVCC与锁机制
题目:解释MySQL InnoDB的MVCC(多版本并发控制)实现原理。什么是当前读和快照读?RR隔离级别下如何解决幻读?(涉及间隙锁、Next-Key Lock)你们项目中遇到过死锁吗?如何分析死锁日志?
考察点:MVCC原理、事务隔离级别、锁机制-4
34. Elasticsearch写入与查询原理
题目:Elasticsearch写入一条文档时,从客户端到最终落盘经历了哪些过程?(涉及translog、refresh、flush、merge)为什么Elasticsearch是近实时搜索?如何优化写入性能和查询性能?
考察点:ES写入流程、段合并、倒排索引
五、Spring家族源码与设计思想(6题)
35. Spring Boot自动配置源码级解析
题目:Spring Boot的自动配置是如何实现的?请从@SpringBootApplication注解开始,一步步说明自动配置的加载过程。@Conditional系列注解是如何工作的?如果你要自定义一个Starter,需要做哪些事情?
考察点:Spring Boot源码、自动配置原理、条件注解-3
36. Spring循环依赖解决
题目:Spring是如何解决循环依赖的?为什么要使用三级缓存,二级缓存不够吗?什么情况下无法解决循环依赖?构造器注入为什么不会发生循环依赖问题?
考察点:IoC源码、三级缓存、循环依赖处理
37. Spring AOP实现原理
题目:Spring AOP的底层实现原理是什么?JDK动态代理和CGLIB的区别是什么?在什么情况下Spring会使用CGLIB?如果目标对象没有实现接口,还能使用JDK动态代理吗?代理对象在Spring容器中是如何存储的?
考察点:AOP原理、动态代理、代理对象生命周期
38. Spring事务传播行为
题目:请举例说明Spring的七种事务传播行为,特别是REQUIRED、REQUIRES_NEW、NESTED的区别。NESTED是如何实现的?(涉及Savepoint)你们项目中遇到过事务失效的场景吗?(如自调用、方法非public、异常被catch等)
考察点:事务传播行为、事务失效场景、Savepoint原理-4
39. Spring MVC请求处理流程
题目:从浏览器发起一个HTTP请求,到Spring MVC返回响应,经历了哪些关键组件?(涉及DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver等)@RequestMapping的请求是如何匹配到具体方法的?拦截器和过滤器有什么区别?
考察点:Spring MVC源码、请求处理流程、组件职责
40. Spring Cloud Gateway与Zuul对比
题目:你们为什么选择Spring Cloud Gateway而不是Zuul?Gateway的WebFlux底层是如何实现非阻塞的?如何设计网关层的限流、熔断、鉴权?网关成为单点瓶颈时,如何保证高可用?
考察点:网关架构、响应式编程、网关高可用设计
六、数据库设计与优化(5题)
41. SQL优化实战案例
题目:请分享一个你印象最深的SQL优化案例。当时遇到什么问题?如何分析(explain、profile、慢查询日志)?最终如何优化(索引、SQL重写、分库分表)?优化前后性能提升多少?
考察点:SQL优化方法论、Explain分析、索引设计
42. 索引失效场景与原理
题目:哪些情况会导致索引失效?请从索引存储结构(B+树)层面解释为什么这些情况会失效。例如,为什么对索引列使用函数会导致失效?为什么要遵循最左前缀原则?
考察点:B+树原理、索引失效原理、最左前缀法则-4
43. 数据库主从延迟解决方案
题目:你们项目中遇到过主从延迟吗?如何监控主从延迟?如果主从延迟严重,对业务有什么影响?如何解决(如强制读主、分库、并行复制)?并行复制是如何实现的?
考察点:主从复制原理、延迟监控、并行复制
44. 分库分表后的全局查询
题目:订单表按用户ID分库分表后,如果运营后台需要按订单号查询,或者按时间范围查询所有用户的订单,如何实现?你有几种方案?(如基因法、索引表、ES异构)各自的优缺点是什么?
考察点:分库分表查询优化、异构数据同步、基因法-4
45. 海量数据归档方案
题目:订单表数据量已经达到几十亿,但业务只关心最近3个月的数据。你会如何设计数据归档方案?归档数据如何存储?如何保证历史数据的查询需求?归档过程中如何不影响在线业务?
考察点:数据生命周期管理、归档策略、冷热分离
七、设计模式与架构设计(5题)
46. 重构烂代码的经验
题目:你接手过一个烂代码项目吗?如何逐步重构的?使用了哪些设计模式?重构过程中如何保证业务逻辑不变?最后效果如何?请分享具体案例。
考察点:重构方法论、设计模式应用、单元测试保障
47. 状态机设计
题目:订单系统中有复杂的状态流转(待支付→已支付→已发货→已完成→已取消),你会如何设计状态机?对比用if/else、状态模式、开源状态机(如Spring StateMachine)的优劣。如何保证状态流转的幂等性和一致性?
考察点:状态机设计、状态模式、幂等性保证
48. 秒杀系统架构设计
题目:请设计一个秒杀系统,要求支撑10万QPS。从前端静态化、页面防刷、接口限流、库存预热、异步下单、防超卖等方面详细说明。画出示意图,并说明每个环节的技术选型和理由。
49. 双写一致性方案
题目:在数据库和缓存(Redis)双写的场景下,如何保证数据一致性?先更新数据库还是先删除缓存?为什么?如果先更新数据库后删除缓存失败了怎么办?(涉及binlog监听+重试机制)
考察点:缓存一致性、延时双删、binlog增量同步-4
50. 领域驱动设计(DDD)落地经验
题目:你们项目中使用过领域驱动设计吗?如何划分限界上下文?聚合根是什么?如何设计仓储(Repository)层?对比传统的三层架构(Controller-Service-DAO),DDD在复杂业务场景下有什么优势?
考察点:DDD思想、聚合设计、限界上下文-4
附:面试准备建议
1. 项目经验呈现模板(CAR模型)
-
Context:项目背景(如“日均千万级订单处理系统”)
-
Challenge:具体技术挑战(如“订单超卖导致10%客诉”)
-
Action:技术方案细节(如“基于Redis分布式锁+数据库乐观锁实现防重”)
-
Result:量化成果(如“超卖率降至0.2%,节省补偿成本50万/年”)-1
2. 技术深度证明
-
准备1-2个源码分析案例(如看过HashMap、Spring Boot源码)
-
准备1-2个线上故障排查案例(如OOM、CPU飙升、消息积压)
-
准备1-2个性能优化案例(如SQL优化、JVM调优)
3. 软技能准备
-
沟通能力:采用PREP结构(观点→理由→举例→重申)
-
学习能力:准备技术成长路线图(近期、中期、长期)
-
团队协作:分享带新人的经验、跨部门协调的经验
更多推荐
所有评论(0)