当Java jvm 一个线程OOM的时候,其它线程还能运行不?这个进程会gg不?

当一个Java程序报OOM的异常的时候,程序会gg吗?是只有一个线程gg呢,还是整个进程gg呢?

/**
 * JVM 堆内存溢出后,其他线程是否可继续工作
 *
 * @author LiXuekai on 2020/7/27
 */
public class WhenOom {

    public static void main(String[] args) {

        new Thread(() -> {
            List<byte[]> list = new ArrayList<>();
            int i = 0;
            while (true) {
                System.out.println(new Date().toString() + " ---" + i++ + " "+ Thread.currentThread().getName());
                byte[] b = new byte[1024 * 1024 * 1];
                list.add(b);
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 线程二
        new Thread(() -> {
            int i = 0;
            while (true) {
                System.out.println(new Date().toString() + " " + i++ + " " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

运行时设置的环境参数:-Xms16M -Xmx32m

运行结果:

运行时jvm的运行时数据区域截图:工具 jvisualvm

在old的空间瞬间下去的时候,就是一个线程因oom而gg的时候。

在一个线程gg之后,堆的使用里面就降低了,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!因为发生OOM之前要进行gc。

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值