一個執行緒OOM後其餘執行緒是否停止
阿新 • • 發佈:2018-12-11
OOM:Out Of Memory。
在多執行緒環境下,每個執行緒擁有一個棧和一個程式計數器。棧和程式計數器用來儲存執行緒的執行歷史和執行緒的執行狀態,是執行緒私有的資源,也就是說,堆是執行緒共享。其他的資源(比如堆、地址空間、全域性變數)是由同一個程序內的多個執行緒共享。當程序中有N個執行緒,且其中一個執行緒丟擲記憶體溢位的異常後,其他執行緒會不會停止呢?
話不多說,亮程式碼:
//我負責檢測執行緒是否停止 public void method1() { while(true){ System.out.println(new Date().toString()+Thread.currentThread()+"=="); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }
//我負責搞事情,保證讓記憶體迅速溢位 public void method2() { List<byte[]> list=new ArrayList<byte[]>(); while(true){ System.out.println(new Date().toString()+Thread.currentThread()+"=="); byte[] b = new byte[1024*1024*512]; list.add(b); System.err.println("已經申請了:"+list.size()/2+"G記憶體"); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }
好了,看看結果如何:
//注意看執行緒:Thread-0,Thread-1 Sun Sep 23 10:18:11 GMT+08:00 2018Thread[Thread-0,5,main]== Sun Sep 23 10:18:11 GMT+08:00 2018Thread[Thread-1,5,main]== 已經申請了:0G記憶體 Sun Sep 23 10:18:12 GMT+08:00 2018Thread[Thread-0,5,main]== Sun Sep 23 10:18:12 GMT+08:00 2018Thread[Thread-1,5,main]== Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space at 多執行緒之OOM.MyObject.method2(MyObject.java:24) at 多執行緒之OOM.MyObject$2.run(MyObject.java:47) at java.lang.Thread.run(Unknown Source) Sun Sep 23 10:18:13 GMT+08:00 2018Thread[Thread-0,5,main]== Sun Sep 23 10:18:14 GMT+08:00 2018Thread[Thread-0,5,main]==
結果顯示:負責搞事情的執行緒一很快就因為OOM把自己給作死了,而作為檢測執行緒的執行緒二仍然堅挺地活著。也即是說:程序中有N個執行緒,其中一個執行緒因為OOM死掉了,其餘執行緒依然繼續執行而不是停止。
查閱相關資料:原來當一個執行緒丟擲OOM異常後,它所佔據的記憶體資源會全部被釋放掉,從而不會影響其他執行緒的執行!