1. 程式人生 > >一個執行緒OOM後其餘執行緒是否停止

一個執行緒OOM後其餘執行緒是否停止

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異常後,它所佔據的記憶體資源會全部被釋放掉,從而不會影響其他執行緒的執行!