當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

相關文章
相關標籤/搜索