一、JVM发生OOM的区域

public class HelloWorld {

    public static void main(String[] args) {
        sayHello();
    }

    private static void sayHello() {
        String message = new String("Hello world!");
        System.out.println(message);
    }
}

jvm19
JVM运行HelloWorld类中的sayHello方法,需要经过以下几个环节:
1、把HelloWorld加载到元空间,由于元空间大小有限,因此当元空间内存不足时容易发生OOM。
2、虚拟机栈执行main方法时,需要把方法压栈,由于虚拟机栈内存大小有限,如果不断压栈,容易发生OOM。
3、执行方法时,方法中创建的局部变量new出来的对象存放在堆中,由于堆内存空间有限,因此当堆内存不足时容易发生OOM。

二、导致OOM发生可能的原因

1、元空间内存溢出
(1)程序系统时需要加载太多的jar,而元空间配置的内存太小。
(2)程序内部频繁通过动态代理创建代理对象。

2、虚拟机栈内存溢出
一般都是方法递归调用导致。

3、堆内存溢出
(1)内存配置太小,而请求并发量太大,导致Full GC后仍然内存不足。
(2)代码中没有合理创建对象,引用没有合理释放,导致GC回收不了。

打赏
支付宝 微信
上一篇 下一篇