1. Java面试的核心考察维度
Java作为企业级开发的主流语言,面试官通常会从四个层面考察候选人能力:语言基础、核心机制、框架生态和系统设计。根据我参与技术面试的经验,80%的初级岗位问题集中在JVM、集合和多线程三大领域,而中高级岗位则更关注性能调优和架构设计。
重要提示:面试官往往通过连续追问来考察知识深度,例如从HashMap实现原理引申到线程安全方案,再延伸到分布式环境下的数据一致性处理。
2. JVM核心机制20问
2.1 内存模型与GC机制
JVM内存区域划分
- 堆区:对象实例存储区域,被所有线程共享
- 方法区:存储类信息、常量、静态变量(JDK8后由元空间实现)
- 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
- 程序计数器:线程私有,记录当前线程执行位置
- 本地方法栈:为Native方法服务
垃圾回收算法对比
// 典型内存泄漏示例 public class MemoryLeak { static List<Object> leakList = new ArrayList<>(); void populateList() { for(int i=0; i<1000; i++) { leakList.add(new byte[1024*1024]); // 每次添加1MB对象 } } }- 标记-清除:产生内存碎片,CMS采用此方式
- 复制算法:新生代回收,空间换时间
- 标记-整理:老年代回收,解决碎片问题
- 分代收集:HotSpot默认策略(新生代+老年代)
G1与ZGC的区别
- G1:面向服务端应用的垃圾收集器,延迟可控
- ZGC:亚毫秒级停顿,支持TB级堆内存
- 关键参数:
-XX:+UseG1GC和-XX:+UseZGC
2.2 类加载与字节码
双亲委派模型破坏场景
- JDBC驱动加载(使用ThreadContextClassLoader)
- OSGi模块化系统
- 热部署场景
方法区OOM排查步骤
# 常见错误日志 java.lang.OutOfMemoryError: Metaspace- 检查
-XX:MetaspaceSize设置 - 使用JVisualVM分析类加载情况
- 排查动态代理生成类
- 检查
3. 集合框架深度解析
3.1 HashMap底层原理
JDK8的树化优化
- 链表长度>8且数组长度≥64时转为红黑树
- 退化阈值:节点数≤6时转回链表
- 哈希扰动函数优化:
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
ConcurrentHashMap分段演进
- JDK7:Segment分段锁(16段)
- JDK8:CAS+synchronized锁头节点
- size()方法优化:基于CounterCell的统计
3.2 并发集合对比
CopyOnWriteArrayList适用场景
- 读多写少(监听器列表)
- 迭代期间允许修改
- 缺陷:内存占用大,数据实时性差
BlockingQueue实现对比
实现类 锁类型 特点 ArrayBlockingQueue ReentrantLock 固定容量 LinkedBlockingQueue 双锁分离 可选边界 PriorityBlockingQueue ReentrantLock 优先级排序 SynchronousQueue 无缓冲 直接传递
4. 多线程与并发编程
4.1 线程状态管理
wait()与sleep()的区别
- 调用wait()会释放锁,sleep()不会
- wait()必须在同步块中使用
- sleep()是Thread类方法,wait()是Object方法
ThreadLocal内存泄漏防范
public class SafeThreadLocal { private static final ThreadLocal<SimpleDateFormat> formatter = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd")); public void remove() { formatter.remove(); // 必须显式清理 } }
4.2 锁机制进阶
AQS实现原理
- 核心字段:state(volatile int)
- CLH队列管理等待线程
- 模板方法模式:tryAcquire()需子类实现
偏向锁升级过程
- 初始无锁状态
- 第一个线程访问→偏向锁
- 出现竞争→轻量级锁(CAS自旋)
- 自旋失败→重量级锁
5. Spring框架核心考点
5.1 IOC容器原理
Bean生命周期关键节点
- 实例化
- 属性填充
- Aware接口回调
- 初始化前/后处理器
- 销毁前回调
循环依赖解决机制
- 三级缓存:
- singletonObjects:完整Bean
- earlySingletonObjects:早期引用
- singletonFactories:ObjectFactory
- 三级缓存:
5.2 AOP实现方式
JDK动态代理限制
- 只能代理接口
- 性能优于CGLIB
- InvocationHandler处理逻辑
@Transactional失效场景
- 非public方法
- 自调用问题
- 异常类型不匹配
- 数据库引擎不支持
6. 数据库与性能优化
6.1 MySQL索引优化
B+树索引优势
- 相比B树:更高的扇出,更少的IO
- 叶子节点链表结构适合范围查询
- 聚簇索引数据存储有序
Explain关键字段解读
- type:从优到差 system > const > ref > range > index > ALL
- Extra:Using filesort(需要优化)
6.2 事务隔离级别
- MVCC实现原理
- 隐藏字段:DB_TRX_ID, DB_ROLL_PTR
- ReadView生成规则
- 快照读与当前读区别
7. 分布式系统专题
7.1 CAP理论实践
ZooKeeper的CP特性
- Zab协议保证顺序一致性
- 选举期间不可用
- 观察者节点提升读性能
Redis集群数据分片
- 哈希槽(16384个slot)
- MOVED/ASK重定向
- 批量操作限制
7.2 分布式锁实现
- RedLock算法争议
- 时钟漂移问题
- 官方建议:优先考虑单实例+备份
- 替代方案:Zookeeper临时顺序节点
8. 设计模式实战案例
8.1 创建型模式
Spring中的工厂模式
- BeanFactory:基础容器
- ApplicationContext:扩展功能
- FactoryBean:复杂对象创建
Builder模式优势
// Lombok实现 @Builder public class User { private String name; private int age; }- 解决构造器参数过多问题
- 支持链式调用
- 对象创建过程可控
8.2 行为型模式
- 策略模式在支付系统中的应用
- 定义支付接口
- 实现支付宝/微信支付策略
- 通过上下文切换策略
9. 性能调优实战技巧
9.1 JVM参数优化
Young GC频繁调优
- 现象:Eden区快速填满
- 方案:增大
-Xmn或调整-XX:SurvivorRatio - 监控:
jstat -gcutil [pid] 1000
堆外内存泄漏排查
- NMT工具监控:
-XX:NativeMemoryTracking=detail - 对比基线:
jcmd <pid> VM.native_memory baseline - 分析差异:
jcmd <pid> VM.native_memory detail.diff
- NMT工具监控:
9.2 SQL优化案例
- 大表分页优化方案
- 延迟关联:
SELECT * FROM table INNER JOIN (SELECT id FROM table LIMIT 1000000, 10) AS tmp ON table.id = tmp.id- 书签记录:记录上次查询的最后ID
10. 高频场景题解析
10.1 系统设计题
短链系统设计要点
- 哈希算法选择(MurmurHash)
- 发号器设计(Redis INCR)
- 301/302跳转选择
- 防爬虫策略
秒杀系统关键设计
- 分层削峰:静态化→缓存→队列→数据库
- 库存扣减方案:Redis原子操作→异步落库
- 热点key处理:本地缓存+分片
10.2 算法实践题
LRU缓存实现
class LRUCache { private LinkedHashMap<Integer, Integer> map; public LRUCache(int capacity) { map = new LinkedHashMap(16, 0.75f, true) { protected boolean removeEldestEntry(Map.Entry eldest) { return size() > capacity; } }; } }线程安全单例模式
public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
11. 面试实战建议
11.1 问题回答策略
STAR法则应用
- Situation:项目背景
- Task:你的职责
- Action:具体措施
- Result:量化成果
技术深度展示技巧
- 从API使用到底层实现
- 横向对比同类技术
- 结合实际案例说明
11.2 薪资谈判要点
市场行情参考(2023)
职级 年限 薪资范围(万/年) 初级 1-3 15-30 中级 3-5 30-50 高级 5+ 50-80+ 福利条款注意事项
- 年终奖计算方式
- 期权兑现条件
- 竞业限制范围
12. 持续学习路径
12.1 技术演进跟踪
Java新特性学习重点
- JDK17:密封类、模式匹配
- JDK21:虚拟线程(Loom项目)
- Valhalla项目:值类型
优质学习资源推荐
- 书籍:《Java并发编程实战》《深入理解JVM》
- 博客:美团技术团队、阿里中间件
- 视频:极客时间《Java核心技术36讲》
12.2 项目经验积累
- 开源贡献入门建议
- 从文档改进开始
- 选择Good First Issue
- 熟悉项目代码风格
- 参与Hacktoberfest等活动
我在技术面试中常发现,候选人最容易在JVM内存模型和分布式事务问题上暴露知识盲区。建议重点准备这两个领域时,不仅要理解理论概念,更要能结合具体业务场景说明解决方案的选择依据。例如当被问到"如何设计一个分布式ID生成器"时,优秀的回答应该包含雪花算法的实现细节、时钟回拨处理方案,以及在不同业务规模下的变通策略。