Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
使用Java開發(fā),經(jīng)?;赜龅絻?nèi)存異常的情況,而StackOverflowError和OutOfMemoryError便是最常遇見的錯誤。
首先,看看這兩種錯誤的解釋:
如果當(dāng)前線程請求的棧深度大于虛擬機(jī)所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機(jī)在擴(kuò)展棧時無法申請到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常。
這里把異常分為兩種情況,但是存在一些相互重疊的地方:當(dāng)??臻g無法繼續(xù)分配時,到底是內(nèi)存太小,還是已經(jīng)使用的??臻g太大,本質(zhì)上是對同一個問題的兩種描述而已。
接下來,兩個小例子分別展示如何產(chǎn)生這兩種異常:
OutOfMemoryError異常:
首先設(shè)置一下虛擬機(jī)啟動參數(shù),如下:

代碼如下:
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());
}
}
}
錯誤信息入下:
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異常:
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;
}
}
}
錯誤信息如下:
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) ......
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
SpringSecurity詳解整合JWT實現(xiàn)全過程
JWT作為一個開放的標(biāo)準(zhǔn)(?RFC?7519?),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實現(xiàn)互踢功能,需要的朋友可以參考下2022-07-07
java實現(xiàn)圖的鄰接表存儲結(jié)構(gòu)的兩種方式及實例應(yīng)用詳解
這篇文章主要介紹了java實現(xiàn)圖的鄰接表存儲結(jié)構(gòu)的兩種方式及實例應(yīng)用詳解,鄰接表構(gòu)建圖是必須需要一個Graph對象,也就是圖對象!該對象包含屬性有:頂點數(shù)、邊數(shù)以及圖的頂點集合,需要的朋友可以參考下2019-06-06
Java與Python之間使用jython工具類實現(xiàn)數(shù)據(jù)交互
今天小編就為大家分享一篇關(guān)于Java與Python之間使用jython工具類實現(xiàn)數(shù)據(jù)交互,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片),文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02
Java實現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了Java實現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,每一個鏈表都包含多個節(jié)點,節(jié)點又包含兩個部分,一個是數(shù)據(jù)域(儲存節(jié)點含有的信息),一個是引用域(儲存下一個節(jié)點或者上一個節(jié)點的地址),需要的朋友可以參考下2022-01-01

