Java中內存異常StackOverflowError與OutOfMemoryError詳解
使用Java開發,經常回遇到內存異常的情況,而StackOverflowError和OutOfMemoryError便是最常遇見的錯誤。
首先,看看這兩種錯誤的解釋:
如果當前線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常。
這里把異常分為兩種情況,但是存在一些相互重疊的地方:當棧空間無法繼續分配時,到底是內存太小,還是已經使用的棧空間太大,本質上是對同一個問題的兩種描述而已。
接下來,兩個小例子分別展示如何產生這兩種異常:
OutOfMemoryError異常:
首先設置一下虛擬機啟動參數,如下:
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.ArrayList; import java.util.List; public class TEST1 { static class OOMObject{ } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while ( true ){ list.add( new OOMObject()); } } } |
錯誤信息入下:
1
2
3
4
5
6
7
8
|
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.util.Arrays.copyOf(Unknown Source) at java.util.ArrayList.grow(Unknown Source) at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) at java.util.ArrayList.ensureCapacityInternal(Unknown Source) at java.util.ArrayList.add(Unknown Source) at com.ws.TEST1.main(TEST1.java: 13 ) |
StackOverflowError異常:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class TEST2 { private int stackLength = 1 ; public void stackLeak() { stackLength++; stackLeak(); } public static void main(String[] args) { TEST2 oom = new TEST2(); try { oom.stackLeak(); } catch (Throwable e) { System.out.println( "stack length:" + oom.stackLength); throw e; } } } |
錯誤信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
stack length: 7585 Exception in thread "main" java.lang.StackOverflowError at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) at com.ws.TEST2.stackLeak(TEST2.java: 8 ) ...... |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/wangshuang1631/article/details/53763641