当一个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。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!