大家好,我是小富~
面试官:OOM类型有哪些?
你:就是老年代放不下了嘛!
面试官:等消息吧!
OOM(Out Of Memory) 错误有多种类型,每种类型对应不同的内存区域或触发场景。以下是常见的 OOM 类型及其产生原因:
java.lang.OutOfMemoryError: Java heap space-Xmx)设置过小,或程序需要处理的数据量超出预期。示例:
// 不断向集合中添加对象导致堆溢出
List<Object> list = new ArrayList<>();
while (true) {
list.add(new Object());
}解决方案:
jmap + MAT 分析堆转储)。-Xmx 和 -Xms)。java.lang.OutOfMemoryError: Metaspace(Java 8+)或 PermGen space(Java 7-)示例:
// 使用 CGLib 动态生成大量代理类
Enhancer enhancer = new Enhancer();
while (true) {
enhancer.setSuperclass(OOM.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> proxy.invokeSuper(obj, args)));
enhancer.create();
}解决方案:
-XX:MaxMetaspaceSize)。java.lang.OutOfMemoryError: Direct buffer memoryByteBuffer.allocateDirect() 分配)耗尽。System.gc() 或 Cleaner 机制)。-XX:MaxDirectMemorySize)设置过小。示例:
// 不断申请直接内存
List<ByteBuffer> buffers = new ArrayList<>();
while (true) {
buffers.add(ByteBuffer.allocateDirect(1024 * 1024)); // 1MB
}解决方案:
-XX:MaxDirectMemorySize。java.lang.OutOfMemoryError: Unable to create new native threadulimit -u)。-Xss)设置过大,导致总内存占用超出。示例:
// 无限创建线程
while (true) {
new Thread(() -> {
try { Thread.sleep(1000000); } catch (InterruptedException e) {}
}).start();
}解决方案:
-Xss 减小线程栈大小。java.lang.OutOfMemoryError: Requested array size exceeds VM limitInteger.MAX_VALUE)。new int[Integer.MAX_VALUE]。解决方案:
java.lang.OutOfMemoryError: GC Overhead limit exceeded解决方案:
java.lang.OutOfMemoryError: CodeCache(JIT 编译代码缓存溢出)解决方案:
-XX:ReservedCodeCacheSize)。-XX:-TieredCompilation)。OOM 的根本原因是 JVM 内存区域不足 或 资源耗尽,需结合错误类型分析具体内存区域(堆、元空间、直接内存等)。
排查时可通过以下步骤:
1、确定 OOM 类型(通过错误日志)。
2、使用工具分析(如 jstat、jmap、VisualVM、MAT)。
3、调整 JVM 参数或优化代码逻辑。
等被裁员在学习?赶紧的吧!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。