Java面试翻车实录:从JVM调优到秒杀架构,牢大面大厂电商岗的三轮暴击
Java面试翻车实录:从JVM调优到秒杀架构,牢大面大厂电商岗的三轮暴击
场景介绍
面试公司:某头部互联网大厂 · 电商核心部门
面试岗位:Java高级开发工程师
面试官:老张,十年架构经验,眼神犀利,问题直击灵魂
候选人:牢大,号称精通Java,实际上简历上的精通等于用过
第一轮:基础热身
问题1:Java 8/11/17的区别?
牢大:Java 8有Lambda和Stream,Java 11有HTTP Client,Java 17有密封类和模式匹配!
面试官:元空间为什么替代永久代?
牢大:元空间用本地内存,不容易OOM!
面试官:不错,密封类用过吗?
牢大:项目还没用上,嘿嘿。
问题2:线上CPU飙升怎么排查?
牢大:先top看进程,再top -Hp看线程,jstack导栈,找RUNNABLE!
面试官:Full GC导致CPU高怎么判断?
牢大:加-XX:+PrintGCDetails看日志?
面试官:配合jstat -gcutil看GC频率更好。内存泄漏怎么定位?
牢大:用MAT分析堆转储?但线上不好dump……
面试官:对,线上用Arthas更轻量。
问题3:HashMap并发问题和ConcurrentHashMap原理?
牢大:JDK 7头插法导致死循环,JDK 8尾插法但会有覆盖。ConcurrentHashMap用CAS加synchronized!
面试官:size()方法怎么保证准确?
牢大:baseCount加CounterCell数组累加?近似值?
面试官:对,需要精确就用LongAdder。第一轮不错,进入第二轮。
第二轮:Spring全家桶与微服务
问题1:Spring Boot自动配置原理?
牢大:@EnableAutoConfiguration加载META-INF下的配置文件!配合@ConditionalOnClass等条件注解!
面试官:Spring Boot 3的重大变化?
牢大:Java 17起步,javax改jakarta,支持GraalVM Native Image!
面试官:不错。
问题2:微服务通信和容错?
牢大:Nacos做注册中心,OpenFeign远程调用,Resilience4j做断路器!
面试官:断路器有几种状态?
牢大:CLOSED、OPEN、HALF_OPEN……三种?
面试官:还有DISABLED和FORCED_OPEN。要多看源码。
问题3:亿级订单表怎么分库分表?
牢大:用ShardingSphere,按user_id取模分库分表!
面试官:跨分片查询怎么办?
牢大:用Elasticsearch做搜索!
面试官:分布式事务怎么解决?
牢大:Seata AT模式,自动生成undo log做补偿!
面试官:AT和TCC有什么区别?
牢大(含糊):AT自动拦截SQL,TCC需要业务实现Try/Confirm/Cancel……
面试官:没错,AT适合中度并发,TCC适合高性能场景。
问题4:Redis缓存一致性?
牢大:先更新数据库再删缓存!或者延迟双删!
面试官:缓存击穿、穿透、雪崩怎么解决?
牢大:击穿用互斥锁,穿透用布隆过滤器,雪崩用随机过期时间加集群!
面试官:答得不错,进入最后一轮。
第三轮:高并发与架构设计
问题1:百万QPS秒杀系统怎么设计?
牢大:前端限流加验证码,Nginx负载均衡,Redis预减库存,MQ异步下单!
面试官:Redis预减库存用Lua脚本保证原子性?
牢大:对对对!
面试官:热点key问题怎么解决?
牢大(卡住):这个……MQ削峰?Worker异步消费?
面试官:对,先把请求排队,不要全打在Redis上。
问题2:Kafka消息可靠性?
牢大:acks=all,重试机制,副本因子3,手动提交offset!
面试官:重复消费怎么保证幂等?
牢大:布隆过滤器加数据库唯一索引?
面试官:对,这是常见组合。
问题3:4C8G机器JVM怎么调优?
牢大:堆给4G,用G1收集器,最大停顿200ms!
面试官:G1的Remembered Set是什么?
牢大(慌了):记录跨区域引用的指针集合?避免全堆扫描?
面试官:理解对了,但深度不够。
问题4:千万日活电商的技术演进?
牢大:单体到微服务到云原生!Spring Cloud加K8s!
面试官:为什么Kafka不是RabbitMQ?
牢大:Kafka吞吐高,适合削峰!
面试官:方案没问题,但缺少对每个组件选型背后设计理念的理解。这是高级开发和架构师的分水岭。
面试官总结
面试官:牢大啊,基础还可以,但分布式高并发深度不够。你先回去等通知,建议把Resilience4j源码、G1 GC原理、秒杀架构流量控制再深入啃一啃。
牢大:好的好的,谢谢张哥!
完整答案与深度解析
第一轮答案解析
问题1:Java版本特性
核心区别:
- Java 8:Lambda、Stream、Optional、CompletableFuture、元空间(替代永久代)
- Java 11:HTTP Client标准化、模块化JPMS、ZGC(实验性)
- Java 17:密封类Sealed Class、模式匹配Pattern Matching、Record类、文本块、ZGC正式可用
元空间替代永久代:永久代大小固定易OOM,元空间使用本地内存,类元数据不再触发Full GC。
问题2:CPU飙升排查
步骤:
- top找高CPU进程PID
- top -Hp PID找高CPU线程TID
- printf '%x\n' TID 转十六进制
- jstack PID导出线程栈,搜索nid=0x十六进制TID
- 定位到业务代码行
Full GC判断:jstat -gcutil PID 1000看FGC列频率,FGCT列耗时。
推荐工具:Arthas的dashboard、thread命令,在线诊断无需重启。
问题3:HashMap与ConcurrentHashMap
JDK 7 HashMap死循环:多线程put时头插法导致环形链表。
JDK 8改进:尾插法+红黑树(链表大于等于8且数组大于等于64时转换),但仍有数据覆盖。
ConcurrentHashMap核心:
- put:空数组用CAS初始化,空槽位CAS插入,有冲突synchronized锁头节点
- get:无锁,volatile保证可见性
- 扩容:多线程协同transfer
- size:baseCount + CounterCell累加(近似值)
第二轮答案解析
问题1:Spring Boot自动配置
原理:@EnableAutoConfiguration通过AutoConfigurationImportSelector加载META-INF/spring下的AutoConfiguration.imports文件。
条件注解:@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等决定配置是否生效。
Spring Boot 3变化:Java 17最低要求,javax迁移jakarta,GraalVM Native Image支持AOT编译,启动速度大幅提升。
问题2:微服务容错
Resilience4j断路器状态:CLOSED(正常)、OPEN(熔断)、HALF_OPEN(试探)、DISABLED(强制关闭)、FORCED_OPEN(强制打开)。
问题3:分库分表与分布式事务
分片策略:ShardingSphere按user_id取模分16库64表。跨分片查询用Elasticsearch。
Seata AT模式:
- 一阶段:执行业务SQL,生成undo log快照,注册分支事务
- 二阶段提交:删除undo log释放锁
- 二阶段回滚:根据undo log生成反向SQL恢复数据
AT vs TCC:AT侵入性低自动拦截SQL,适合中度并发;TCC需业务实现Try/Confirm/Cancel,适合高并发场景。
问题4:Redis缓存一致性
三大问题:
- 缓存穿透:查不存在数据→布隆过滤器或缓存空值
- 缓存击穿:热点key过期→互斥锁SETNX或永不过期异步更新
- 缓存雪崩:大量key同时过期→随机过期时间+Redis集群+本地二级缓存
推荐一致性方案:Canal订阅MySQL Binlog异步同步到Redis。
第三轮答案解析
问题1:秒杀架构
分层架构:客户端到CDN到LVS到Nginx到Gateway到业务层到Redis/MQ到DB
流量控制:前端按钮置灰验证码,Nginx限流,Sentinel/Guava限流,Redis Lua预减库存,MQ异步削峰
热点key解决:MQ削峰排队,Worker异步扣减;多级扣减分散库存分片;Caffeine本地缓存前置过滤。
问题2:Kafka可靠性
生产者:acks=all(所有副本确认)、retries=3、enable.idempotence=true(幂等性)
Broker:replication.factor=3、min.insync.replicas=2
消费者:手动提交offset,处理成功后再commit
幂等方案:布隆过滤器(内存友好但有误判)+ 数据库唯一索引(保底)
问题3:G1 GC调优
典型参数:-Xms4g -Xmx4g、-XX:+UseG1GC、MaxGCPauseMillis=200、IHOP=45
核心概念:
- Region:堆分2048个Region
- RSet:记录跨Region引用,避免全堆扫描
- CSet:本次回收的Region集合
- SATB:并发标记快照算法
GC周期:Young GC到并发标记(IHOP触发)到Mixed GC到Full GC(失败时)
问题4:技术选型对比
Kafka vs RabbitMQ:Kafka百万级吞吐、磁盘顺序写、分区内有序、Pull模式,适合日志和削峰;RabbitMQ万级吞吐、内存为主、Push模式,适合业务解耦。
Nacos vs Eureka:Nacos同时是注册中心和配置中心,支持AP+CP切换,支持主动探测和配置灰度;Eureka仅注册中心且已停更。
学习路径建议
- Java基础:HashMap/ConcurrentHashMap源码、JVM内存模型、GC调优
- Spring生态:自动配置源码、循环依赖三级缓存
- 数据库:MySQL索引优化、分库分表、分布式事务
- 缓存:Redis数据结构、集群、一致性
- 消息队列:Kafka架构、消息可靠性、幂等消费
- 高并发:限流算法、秒杀架构、热点治理
- 微服务:服务发现、链路追踪、容器化部署
面试不是背答案,是展示思考深度。祝大家拿到心仪Offer!
更多推荐



所有评论(0)