以下为60分钟模拟面试的标准节奏安排,每道题的时间分配已包含面试官追问环节。
| 环节 | 时长 | 题目数 | 考察重点 | 建议节奏 |
|---|---|---|---|---|
| 1. 自我介绍 | 3分钟 | — | 表达逻辑、技术栈匹配度 | 简洁有力,突出亮点 |
| 2. Java基础 | 10分钟 | 2题 | 语言核心、集合、异常 | 每题5分钟(含追问) |
| 3. JVM与并发 | 10分钟 | 2题 | 内存模型、GC、线程安全 | 概念+实战各一题 |
| 4. Spring原理 | 10分钟 | 2题 | IoC/AOP、事务、循环依赖 | 源码级理解优先 |
| 5. 分布式系统 | 10分钟 | 2题 | 一致性、服务治理、分布式事务 | 结合实际场景回答 |
| 6. 数据库与缓存 | 10分钟 | 2题 | 索引优化、Redis、缓存穿透 | SQL+NoSQL结合 |
| 7. 项目经验 | 10分钟 | 2题 | 技术选型、难点攻克、架构演进 | STAR法则回答 |
| 8. 反问环节 | 5分钟 | — | 候选人提问质量 | 准备2-3个有深度的问题 |
| 合计 | 60分钟 | 12题 |
首先点明JDK 7使用数组+链表(头插法),JDK 8改为数组+链表+红黑树(尾插法)。核心变化:① 链表长度≥8且数组长度≥64时树化,长度≤6时退化为链表;② 扩容时JDK 7需rehash计算新位置,JDK 8通过位运算(e.hash & oldCap)将链表拆分为高低位两条链表,性能更优;③ 头插法在多线程扩容时可能形成环形链表导致死循环,JDK 8改为尾插法规避此问题。最后补充:HashMap非线程安全,并发场景应使用ConcurrentHashMap。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能清晰对比JDK 7/8差异,准确描述树化条件、扩容优化、并发问题,能展开到ConcurrentHashMap | 9-10分 |
| A档 | 能说出主要差异(红黑树、尾插法),但细节不够深入 | 7-8分 |
| B档 | 仅知道HashMap有红黑树优化,说不清具体变化 | 5-6分 |
| C档 | 回答零散,对HashMap底层结构理解模糊 | 0-4分 |
先给出结论:String不可变,StringBuilder和StringBuffer可变。String底层在JDK 9之前是final char[],JDK 9之后改为byte[] + coder字段(LATIN1/UTF16),节省空间。不可变性带来线程安全、hash缓存、常量池复用等好处。StringBuilder和StringBuffer都继承AbstractStringBuilder,底层也是可变byte[]。区别在于StringBuffer的方法加了synchronized,线程安全但性能较低。补充:字符串常量池在JDK 7之后从方法区移到了堆中;使用+拼接字符串时,编译器会优化为StringBuilder.append(),但在循环中拼接仍会创建多个StringBuilder对象,建议手动使用StringBuilder。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能深入底层(byte[]+coder、常量池位置变化、编译优化),举例说明性能差异 | 9-10分 |
| A档 | 能说清三者的区别和适用场景,了解底层是char[]/byte[] | 7-8分 |
| B档 | 仅知道String不可变、StringBuffer线程安全,底层实现不清晰 | 5-6分 |
| C档 | 概念混淆,说不出底层实现 | 0-4分 |
先说明GC算法的演进:Serial→Parallel→CMS→G1→ZGC。CMS:以最短停顿时间为目标,四个阶段中只有初始标记和重新标记需要STW。缺点是:①并发阶段占用CPU导致吞吐量下降;②并发清除时产生浮动垃圾;③基于标记-清除算法,产生内存碎片,最终触发Full GC时使用Serial Old单线程回收,停顿时间极长。G1:将堆划分为2048个Region,每个Region可以是Eden/Survivor/Old/Humongous。G1的GC分为Young GC和Mixed GC。G1的停顿预测模型根据历史数据估算回收指定Region所需时间,尽量满足用户设定的停顿目标。JDK 9将G1设为默认GC,CMS被标记为Deprecated。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能完整描述CMS和G1的回收阶段、优缺点、适用场景,能对比ZGC | 9-10分 |
| A档 | 能说清CMS四个阶段和G1的Region机制,但细节不够 | 7-8分 |
| B档 | 知道CMS和G1的区别,但说不清具体回收过程 | 5-6分 |
| C档 | 只能说出几种GC名称,不理解原理 | 0-4分 |
首先明确volatile的两大语义:可见性和有序性。可见性通过缓存一致性协议(如MESI)实现,写volatile变量时会强制刷新到主存,读时从主存读取。有序性通过插入内存屏障实现:写volatile变量前插入StoreStore屏障,写后插入StoreLoad屏障;读volatile变量后插入LoadLoad和LoadStore屏障。DCL单例:instance = new Singleton()在字节码层面分为三步——①分配内存 ②初始化对象 ③将引用指向内存地址。若不加volatile,②和③可能被重排序,导致另一个线程拿到未初始化完成的对象。volatile禁止了这种重排序。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能深入内存屏障、happens-before、DCL指令重排序细节,结合实际场景 | 9-10分 |
| A档 | 能说清可见性和有序性,能解释DCL中volatile的作用 | 7-8分 |
| B档 | 知道volatile能保证可见性,但对有序性和DCL理解不深 | 5-6分 |
| C档 | 概念模糊,说不清volatile和synchronized的区别 | 0-4分 |
IoC容器启动:①通过ResourceLoader加载配置;②BeanDefinitionReader解析配置生成BeanDefinition;③BeanDefinition注册到BeanFactory;④执行BeanFactoryPostProcessor。Bean生命周期:实例化→属性赋值→Aware接口回调→BeanPostProcessor前置处理→InitializingBean.afterPropertiesSet()/init-method→BeanPostProcessor后置处理→Bean就绪→容器关闭时执行DisposableBean.destroy()/destroy-method。循环依赖:Spring使用三级缓存解决——①singletonObjects(一级,成品Bean);②earlySingletonObjects(二级,提前曝光的半成品);③singletonFactories(三级,ObjectFactory)。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能完整描述IoC启动流程+Bean生命周期+三级缓存解决循环依赖的源码级细节 | 9-10分 |
| A档 | 能说清Bean生命周期和三级缓存机制,但源码细节不够 | 7-8分 |
| B档 | 知道Bean生命周期步骤,对循环依赖理解停留在概念层面 | 5-6分 |
| C档 | 只能说出IoC是控制反转,不理解具体流程 | 0-4分 |
先列举最常用的三种传播行为:REQUIRED(默认,有则加入无则创建)、REQUIRES_NEW(挂起当前事务创建新事务)、NESTED(嵌套事务,使用Savepoint回滚点)。实现原理:@Transactional通过AOP生成代理对象,TransactionInterceptor在目标方法前后织入事务逻辑。事务失效场景:①@Transactional加在private方法上;②同类方法内部调用(this.method()绕过代理);③异常被catch后未抛出;④rollbackFor未指定,且抛出的不是RuntimeException;⑤数据库引擎不支持事务(如MyISAM)。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能说出7种传播行为,深入AOP实现原理,列举5种以上事务失效场景 | 9-10分 |
| A档 | 能说清常用传播行为,了解实现原理,能说出3种失效场景 | 7-8分 |
| B档 | 知道REQUIRED/REQUIRES_NEW,对实现原理理解模糊 | 5-6分 |
| C档 | 只会用@Transactional,不理解传播行为和失效原因 | 0-4分 |
先引出CAP理论:分布式系统无法同时满足一致性、可用性和分区容错性。BASE理论强调最终一致性。解决方案对比:①2PC——强一致性,但存在同步阻塞、单点故障问题;②TCC——对业务侵入性强,需要实现Try/Confirm/Cancel三个接口;③本地消息表+MQ——将分布式事务转化为本地事务+消息队列;④Seata AT——自动生成反向SQL实现回滚,对业务代码无侵入。推荐方案:高并发场景用TCC或Seata AT;最终一致性场景用事务消息(RocketMQ)。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能对比4种以上方案,深入原理(如Seata AT的镜像机制),结合CAP分析 | 9-10分 |
| A档 | 能说清2PC/TCC/消息表三种方案及适用场景 | 7-8分 |
| B档 | 知道分布式事务概念,能说出2-3种方案但理解不深 | 5-6分 |
| C档 | 只知道CAP理论,说不清具体实现方案 | 0-4分 |
推荐技术栈:Spring Cloud Alibaba(Nacos + Sentinel + Gateway + SkyWalking)。注册中心选Nacos:支持CP和AP模式切换。配置中心:Nacos Config + @RefreshScope实现动态刷新。网关:Spring Cloud Gateway基于WebFlux,非阻塞IO。熔断降级:Sentinel支持流控(QPS/线程数)、熔断(慢调用/异常比例/异常数)、热点参数限流。可观测性:SkyWalking + Prometheus + ELK + Micrometer。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能设计完整架构,深入选型对比,考虑可观测性 | 9-10分 |
| A档 | 能说出核心组件选型和功能,架构设计合理 | 7-8分 |
| B档 | 知道注册中心、网关、熔断的概念,但选型和原理不清晰 | 5-6分 |
| C档 | 只听说过微服务,说不出具体组件 | 0-4分 |
B+树特点:非叶子节点只存索引不存数据,叶子节点存数据且形成有序链表。相比B树,B+树I/O次数更少,范围查询更高效。聚簇索引:InnoDB的主键索引就是聚簇索引,叶子节点存储整行数据。非聚簇索引(二级索引)叶子节点存储主键值,查询时需要回表。最左前缀:联合索引(a,b,c)中,查询条件必须从a开始匹配。索引下推(ICP):MySQL 5.6引入,在索引遍历过程中对索引包含的字段先做过滤,减少回表次数。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能深入B+树结构、ICP、MRR等高级特性,能结合实际SQL优化案例 | 9-10分 |
| A档 | 能说清B+树、聚簇索引、最左前缀,能分析索引失效场景 | 7-8分 |
| B档 | 知道B+树和索引类型,但对优化策略理解不深 | 5-6分 |
| C档 | 只知道索引能加速查询,说不清底层原理 | 0-4分 |
高可用方案:主从+哨兵适合数据量<10G的场景,哨兵通过Raft协议选举Leader;Redis Cluster适合数据量大的场景,自动分片。三大缓存问题:①缓存穿透——布隆过滤器+缓存空值;②缓存击穿——互斥锁+逻辑过期;③缓存雪崩——过期时间加随机值+多级缓存。缓存一致性:推荐Cache Aside Pattern——读时先读缓存,未命中则读DB并回写缓存;写时先更新DB再删除缓存(延迟双删)。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 能深入哨兵/Cluster原理,清晰对比缓存一致性方案,有实战经验 | 9-10分 |
| A档 | 能说清三大缓存问题和高可用方案,了解一致性方案 | 7-8分 |
| B档 | 知道缓存穿透/击穿/雪崩,但对高可用和一致性理解不深 | 5-6分 |
| C档 | 只会用Redis做缓存,说不清高可用和一致性方案 | 0-4分 |
建议按STAR法则组织回答:Situation(项目背景)→ Task(你的任务)→ Action(具体行动)→ Result(量化结果)。示例框架:"我在XX电商公司负责订单系统的重构,原系统在双11大促时QPS仅2000,响应时间超过5秒。我主导了系统拆分、引入Redis缓存、使用RocketMQ异步削峰、数据库分库分表。重构后系统支撑QPS 20000+,响应时间降至200ms以下,双11当天零故障。"重点突出:技术选型理由、对比数据、踩坑经验。
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | STAR完整,数据量化清晰,技术选型有深度对比,有踩坑经验 | 9-10分 |
| A档 | STAR完整,有数据支撑,技术描述准确 | 7-8分 |
| B档 | STAR结构不完整,缺乏数据量化,技术描述较浅 | 5-6分 |
| C档 | 流水账式描述,缺乏重点和数据支撑 | 0-4分 |
第一步(定位进程):使用top -c找到CPU最高的Java进程PID。第二步(定位线程):top -Hp
| 档次 | 表现 | 分数 |
|---|---|---|
| S档 | 排查步骤完整,能熟练使用工具,有实际线上排查经验,能说出止损措施 | 9-10分 |
| A档 | 能说出排查流程和常用命令,定位思路清晰 | 7-8分 |
| B档 | 知道用top和jstack,但排查步骤不完整 | 5-6分 |
| C档 | 只会重启服务器,缺乏系统排查思路 | 0-4分 |
| 题目 | 环节 | 满分 | 得分 | 备注 |
|---|---|---|---|---|
| 第1题 HashMap实现差异 | Java基础 | 10 | ||
| 第2题 String/StringBuilder/StringBuffer | Java基础 | 10 | ||
| 第3题 CMS与G1垃圾回收 | JVM与并发 | 10 | ||
| 第4题 volatile与DCL | JVM与并发 | 10 | ||
| 第5题 IoC与Bean生命周期 | Spring原理 | 10 | ||
| 第6题 事务传播行为 | Spring原理 | 10 | ||
| 第7题 分布式事务 | 分布式系统 | 10 | ||
| 第8题 微服务架构设计 | 分布式系统 | 10 | ||
| 第9题 MySQL索引 | 数据库缓存 | 10 | ||
| 第10题 Redis高可用与缓存一致性 | 数据库缓存 | 10 | ||
| 第11题 项目经验(STAR) | 项目经验 | 10 | ||
| 第12题 CPU飙升排查 | 项目经验 | 10 | ||
| 合计 | 120 |