一、 JVM深度解析:内存模型与垃圾回收
JVM一直是Java面试中的重头戏,尤其是针对3-5年经验的候选人。在java面试宝典最新整理中,JVM部分不再局限于内存区域的划分,而是更侧重于GC算法的选择、调优参数以及线上故障排查。
1.1 内存区域划分与OOM排查
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范》,这些区域有各自的用途和创建销毁时间。
📌 核心考点:堆内存与栈内存的区别
- 堆内存 (Heap):是JVM管理的最大内存区域,所有线程共享。主要用于存放对象实例和数组。若堆内存不足,会抛出
java.lang.OutOfMemoryError: Java heap space。 - 虚拟机栈 (VM Stack):线程私有,生命周期与线程相同。描述的是Java方法执行的内存模型,存储局部变量表、操作数栈、动态链接等。若栈深度超过限制,抛出
StackOverflowError。 - 元空间 (Metaspace):JDK 8取代了永久代,使用本地内存。若加载的类信息过多,可能抛出
OutOfMemoryError: Metaspace。
1.2 垃圾回收算法与调优
理解GC算法是解决内存泄漏和性能瓶颈的关键。主流的GC算法包括标记-清除、标记-复制和标记-整理。
| 垃圾收集器 | 适用区域 | 算法 | 特点 |
|---|---|---|---|
| Serial | 新生代 | 标记-复制 | 单线程,简单高效,适用于Client模式 |
| ParNew | 新生代 | 标记-复制 | Serial的多线程版本,CMS的前置收集器 |
| Parallel Scavenge | 新生代 | 标记-复制 | 吞吐量优先,自适应调节策略 |
| G1 | 全堆 | 标记-整理 | 可预测停顿时间,大内存首选,JDK 9默认 |
| ZGC | 全堆 | 读屏障+染色指针 | 低延迟,STP时间极短,支持TB级堆 |
二、 并发编程:JUC与线程池实战
在java面试宝典最新整理中,并发编程是区分初级与高级开发工程师的分水岭。面试官通常通过线程池参数、锁机制及并发容器来考察候选人的底层理解。
2.1 线程池七大参数与拒绝策略
手动创建线程池是面试高频题,严禁使用 Executors 工具类,因为容易造成OOM。必须遵循 ThreadPoolExecutor 的七大参数。
// 线程池创建示例
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(100), // 工作队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
2.2 锁机制演进
从 synchronized 到 ReentrantLock,再到 Java 16 引入的 StructuredTaskScope,锁的优化一直在进行。
- synchronized:JDK 1.6后引入偏向锁、轻量级锁(自旋锁)和重量级锁的升级机制,减少上下文切换开销。
- ReentrantLock:基于AQS实现,支持公平锁/非公平锁,支持条件变量(Condition),功能更灵活但需手动释放锁。
- StampedLock:乐观读模式,读多写少场景下性能优于ReentrantLock。
三、 Spring生态:IOC、AOP与事务传播
Spring框架是Java企业级开发的事实标准。在java面试宝典最新整理中,Spring源码解析和事务管理是必问环节。
3.1 Bean的生命周期
理解Bean的生命周期有助于解决循环依赖和自定义Bean初始化问题。流程大致为:实例化 → 属性赋值 → 初始化(BeanPostProcessor前置/后置) → 销毁。
3.2 事务传播机制
事务传播行为决定了业务方法被调用时的事务边界。最常见的包括 REQUIRED(默认,加入当前事务)和 REQUIRES_NEW(挂起当前事务,开启新事务)。
💡 常见面试题:为什么Spring事务在同类方法调用中失效?
因为Spring AOP基于动态代理实现。同类方法调用时,直接通过 this 调用,绕过了代理对象,导致事务切面无法拦截。解决方案包括:提取公共类、注入自身代理、或使用 AopContext.currentProxy()。
四、 数据库:MySQL优化与索引原理
MySQL是Java后端最核心的持久层数据库。索引原理、事务隔离级别及SQL调优是面试常客。
4.1 B+树索引原理
MySQL InnoDB引擎默认使用B+树作为索引结构。相比B树,B+树所有数据都在叶子节点,非叶子节点仅存储键值,使得树更矮胖,IO次数更少。且叶子节点通过双向链表连接,适合范围查询。
4.2 事务隔离级别与MVCC
MySQL默认隔离级别为 Repeatable Read(可重复读),通过MVCC(多版本并发控制)和锁机制实现。MVCC通过Read View和Undo Log实现非锁定读,提高了并发性能。
五、 微服务架构:Spring Cloud与分布式难题
随着单体应用向微服务转型,Spring Cloud生态成为主流。在java面试宝典最新整理中,服务注册发现、负载均衡、熔断降级及分布式事务是考察重点。
5.1 服务治理组件
- Nacos:兼具服务注册发现与配置中心功能,支持AP/CP模式切换,目前国内大厂首选。
- OpenFeign:声明式Web服务客户端,简化HTTP调用。
- Sentinel:流量控制、熔断降级,替代Hystrix,提供更丰富的实时监控。
5.2 分布式事务解决方案
分布式事务是微服务架构下的痛点。常见方案包括:
- 2PC/XA:强一致性,性能差,阻塞性强。
- TCC:Try-Confirm-Cancel,业务侵入性强,但性能好。
- Seata AT模式:无侵入,基于全局锁和Undo Log,适合大多数场景。
- 消息队列最终一致性:可靠消息+本地消息表,高可用,允许短暂不一致。