Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
使用Java開發(fā),經(jīng)?;赜龅絻?nèi)存異常的情況,而StackOverflowError和OutOfMemoryError便是最常遇見的錯誤。
首先,看看這兩種錯誤的解釋:
如果當前線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機在擴展棧時無法申請到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常。
這里把異常分為兩種情況,但是存在一些相互重疊的地方:當棧空間無法繼續(xù)分配時,到底是內(nèi)存太小,還是已經(jīng)使用的??臻g太大,本質(zhì)上是對同一個問題的兩種描述而已。
接下來,兩個小例子分別展示如何產(chǎn)生這兩種異常:
OutOfMemoryError異常:
首先設(shè)置一下虛擬機啟動參數(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作為一個開放的標準(?RFC?7519?),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實現(xiàn)互踢功能,需要的朋友可以參考下2022-07-07java實現(xiàn)圖的鄰接表存儲結(jié)構(gòu)的兩種方式及實例應(yīng)用詳解
這篇文章主要介紹了java實現(xiàn)圖的鄰接表存儲結(jié)構(gòu)的兩種方式及實例應(yīng)用詳解,鄰接表構(gòu)建圖是必須需要一個Graph對象,也就是圖對象!該對象包含屬性有:頂點數(shù)、邊數(shù)以及圖的頂點集合,需要的朋友可以參考下2019-06-06Java與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導入導出富文本(含圖片)的詳細代碼
這篇文章主要為大家詳細介紹了利用Java實現(xiàn)word導入導出富文本(含圖片),文中的示例代碼講解詳細,對大家的學習或工作有一定的幫助,感興趣的小伙伴可以學習一下2024-02-02Java實現(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