
Java 面试中 JVM 和 OOM 是关键环节,高并发和事务更是热门考点!如何全面备考?
在这篇文章中,猫头虎将帮助你重点掌握:
用理论+实战的方式,全面备考 Java 面试!
Java 堆内存溢出
原因:堆中对象过多导致内存不足。
示例:
List<String> list = new ArrayList<>();
while (true) {
list.add("OOM Test");
}排查方法:
jvisualvm 或 MAT)分析堆快照。方法区内存溢出
原因:大量动态生成类或常量池溢出。
示例:
for (int i = 0; i < 100000; i++) {
String str = String.valueOf(i).intern();
}直接内存溢出
调整 JVM 参数:
-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m优化代码逻辑,避免过多对象创建。
内存区域 | 作用 | 常见问题 |
|---|---|---|
堆(Heap) | 存储对象实例 | 内存泄漏、OOM |
方法区(Method Area) | 存储类信息和常量池 | 类加载过多、方法区溢出 |
栈(Stack) | 保存线程栈帧 | 栈溢出(StackOverflow) |
直接内存 | NIO 分配的内存 | 直接内存溢出 |
-Xms 和 -Xmx 设置为相同值,减少 GC 频率。锁升级的过程? 回答:偏向锁(无竞争)→ 轻量级锁(少量竞争)→ 重量级锁(大量竞争)。
如何避免锁升级?
synchronized (this) {
criticalSection();
}线程安全问题
private int count = 0;
public synchronized void increment() {
count++;
}资源竞争
使用线程池:避免频繁创建和销毁线程。
ExecutorService executor = Executors.newFixedThreadPool(10);非阻塞 I/O:减少线程阻塞等待。
隔离级别 | 特点 | 问题解决 |
|---|---|---|
Read Uncommitted | 允许读取未提交数据,性能最高 | 存在脏读问题 |
Read Committed | 读取提交数据,避免脏读 | 存在不可重复读 |
Repeatable Read | 保证同一事务中多次读取一致 | 避免不可重复读,存在幻读问题 |
Serializable | 完全隔离,性能最低 | 避免幻读,适用于关键场景 |
回答:根据性能和数据一致性需求选择:
Repeatable Read,避免不可重复读。Serializable,保证数据绝对一致性。未来趋势: 从 JVM 性能调优到高并发优化,Java 技术在大规模分布式系统和事务管理中的应用将持续增强。通过实践与复盘,你将更轻松应对 Java 面试中的高频考点!