當一個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