JVM OOM解决方案——20210928

JVM 发生 OOM 的 8 种原因、及解决办法

大家好,我是指北君。

作为一个Java软件开发工程师,JVM的相关知识是必不可少的,而JVM发生OOM的排查与解决也是面试当中的重中之重,所以,今天指北君就来聊聊JVM发生OOM的几种原因与解决办法


1. 堆空间使用过多

原因

1、Java 堆中无法再分配对象

2、对象被引用,导致对象无法被 GC 回收

3、应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。

解决方案

1、通过调节JVM参数 -Xmx 增加堆大小

2、优化程序,解决内存泄漏问题


2. GC 开销过大

原因

1、Java不断的

解决方案

1、通过调节JVM参数 -Xmx 增加堆大小

2、通过调节JVM参数 -XX:-UseGCOverheadLimit 取消 GC 开销限制

3、修复应用程序中的内存泄漏


3. 请求的数组大小超过虚拟机限制

原因

1、应用程序试图分配一个超过堆大小的数组

解决方案

1、通过调节JVM参数 -Xmx 增加堆大小

2、优化代码,不要一次性分配这么大的数组


4. Perm gen 空间

原因

Perm gen 空间包含:

1、类的名字、字段、方法

2、与类相关的对象数组和类型数组

3、JIT 编译器优化

当 Perm gen 空间用尽时,将抛出异常。

解决方案

1、通过调节JVM参数 -XX: MaxPermSize 增加 Permgen 大小


5. Metaspace

原因

1、从 Java 8 开始 Perm gen 改成了 Metaspace,在本机内存中分配 class 元数据(称为 metaspace)。如果 metaspace 耗尽,则抛出异常

解决方案

1、调节参数 -XX: MaxMetaSpaceSize 增加 metaspace 大小

2、增加服务器的内存

3、检查代码,可能是bug引起的


6. 发生 stack_trace_with_native_method

原因

1、native method 分配失败

2、查看堆栈信息,最顶层的帧是 native method

解决方案

1、使用操作系统本地工具进行诊断


7. 杀死进程或子进程

原因

1、内存不足,在可用内存极低的情况下会杀死进程

解决方案

1、将进程迁移到不同的机器上

2、给机器增加更多内存

3、这是由操作系统而非 JVM 触发的。


好了,今天的内容就讲完了了。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。