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