OOM 一定会导致 JVM 退出吗?

目录

《OOM 一定会导致 JVM 退出吗?》

一、主线程发生 OOM 且及时处理

二、主线程发生 OOM 未及时处理

三、子线程发生 OOM 未及时处理


在 Java 开发中,内存溢出(OOM)是一个常见的问题。那么,OOM 一定会导致 JVM 退出吗?这是一个在面试中可能会被问到的问题,也是很多同学比较疑惑的点。下面我们来分几种情况进行分析。

一、主线程发生 OOM 且及时处理

如果在主线程发生内存溢出,并且能够及时处理,比如使用try-catch捕获住异常,并且及时释放掉一些内存,那么程序是可以继续运行的。

以下是一个简单的代码示例:

public class Main {
    public static void main(String[] args) {
        try {
            // 模拟可能发生内存溢出的操作
            int[] largeArray = new int[Integer.MAX_VALUE];
        } catch (OutOfMemoryError e) {
            System.out.println("捕获到内存溢出异常,进行处理");
            // 可以在这里进行一些内存释放的操作
        }
        System.out.println("程序继续运行");
    }
}

二、主线程发生 OOM 未及时处理

如果在主线程中间发生内存溢出,且没有及时处理这种内存溢出的异常,那么程序会马上退出。因为此时线程肯定已经没办法执行,而如果 JVM 中又没有其他存活的非守护线程来保持程序运行,所以它会马上退出。

三、子线程发生 OOM 未及时处理

如果是子线程中间发生了内存溢出,且没有及时处理的话,因为主线程它还是在运行的,所以程序不会马上退出。

下面是一个演示上述情况的代码示例:

class MyThread1 extends Thread {
    @Override
    public void run() {
        try {
            omMethod();
        } catch (OutOfMemoryError e) {
            System.out.println("线程 1 捕获到内存溢出异常");
        }
    }
}

class MyThread2 extends Thread {
    @Override
    public void run() {
        omMethod();
    }
}

public class Main {
    public static void omMethod() {
        // 分配一个非常大的数组,肯定会导致内存溢出
        int[] largeArray = new int[Integer.MAX_VALUE];
    }

    public static void main(String[] args) {
        MyThread1 thread1 = new MyThread1();
        MyThread2 thread2 = new MyThread2();
        thread1.start();
        thread2.start();

        try {
            omMethod();
            System.out.println("主线程捕获到内存溢出异常,进行处理");
        } catch (OutOfMemoryError e) {
            System.out.println("主线程未捕获到内存溢出异常,程序退出");
        }

        System.out.println("主线程继续执行");
    }
}

通过运行这段代码,可以看到两个线程正常都会执行,只不过线程 2(MyThread2)会抛内存溢出的错误,但是它并不会导致整个 JVM 退出。当主线程执行到omMethod方法且没有捕获异常时,会导致主线程结束,进而整个 JVM 进程结束。

综上所述,OOM 不一定会导致 JVM 退出,具体情况取决于内存溢出发生的位置以及是否及时进行了处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值