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

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

/**
 * 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 -Xmx32mjvm

运行结果:工具

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

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

在一个线程gg以后,堆的使用里面就下降了,当一个线程抛出OOM异常后,它所占据的内存资源会所有被释放掉,从而不会影响其余线程的运行!由于发生OOM以前要进行gc。blog

相关文章
相关标签/搜索