题目
JVM内存区域划分及常见内存溢出异常分析
信息
- 类型:问答
- 难度:⭐⭐
考点
JVM内存模型,垃圾回收机制,内存溢出异常
快速回答
JVM内存主要分为:
- 线程私有区:程序计数器、Java虚拟机栈、本地方法栈
- 线程共享区:堆、方法区(元空间)
常见内存溢出异常:
StackOverflowError:栈深度超出限制OutOfMemoryError: Java heap space:堆内存不足OutOfMemoryError: Metaspace:元空间耗尽
一、JVM内存区域划分
根据《Java虚拟机规范》,内存区域分为:
- 程序计数器:当前线程执行的字节码行号指示器
- Java虚拟机栈:存储栈帧(局部变量表、操作数栈等)
- 本地方法栈:为Native方法服务
- 堆:存放对象实例(GC主要区域)
- 方法区(元空间):存储类信息、常量、静态变量(JDK8+使用本地内存)
二、内存溢出异常原理与示例
1. StackOverflowError
触发条件:线程请求的栈深度超过虚拟机允许的最大深度(通常由无限递归引起)
// 递归调用导致栈溢出示例
public class StackOverflowDemo {
public static void recursiveCall() {
recursiveCall(); // 无限递归
}
public static void main(String[] args) {
recursiveCall();
}
}
// 输出:Exception in thread "main" java.lang.StackOverflowError2. OutOfMemoryError: Java heap space
触发条件:堆内存无法分配新对象且GC后仍空间不足
// 堆内存溢出示例
public class HeapOOM {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 持续分配1MB数组
}
}
}
// 输出:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space3. OutOfMemoryError: Metaspace
触发条件:加载的类元数据超过元空间容量(JDK8+)
// 元空间溢出示例(借助CGLib动态生成类)
public class MetaspaceOOM {
static class OOMObject {}
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) ->
proxy.invokeSuper(obj, args1));
while (true) {
enhancer.create(); // 持续生成动态代理类
}
}
}
// 输出:Exception in thread "main" java.lang.OutOfMemoryError: Metaspace三、最佳实践与调优
- 栈溢出:
- 检查递归终止条件
- 使用
-Xss调整栈大小(谨慎使用)
- 堆溢出:
- 使用
-Xmx/-Xms合理设置堆大小 - 分析内存泄漏(MAT、JProfiler工具)
- 优化对象生命周期(避免长生命周期对象持有短生命周期对象引用)
- 使用
- 元空间溢出:
- 使用
-XX:MaxMetaspaceSize设置上限 - 检查类加载器泄漏(如OSGi、热部署场景)
- 减少动态生成类(如反射、CGLib)
- 使用
四、常见错误
- 混淆
StackOverflowError和OutOfMemoryError - 认为增大内存能解决所有OOM(忽略内存泄漏问题)
- 未区分JDK7(永久代)和JDK8+(元空间)的方法区实现差异
五、扩展知识
- 直接内存溢出:
OutOfMemoryError: Direct buffer memory(NIO的ByteBuffer.allocateDirect()) - GC Overhead Limit Exceeded:GC时间超过98%且回收效果低于2%
- 内存分析工具:
- 命令行:jmap + jhat / jvisualvm
- 独立工具:Eclipse MAT、JProfiler
- 线上诊断:Arthas