Java中內存異常StackOverflowError與OutOfMemoryError詳解
Java中內存異常StackOverflowError與OutOfMemoryError詳解
使用Java開發(fā),經?;赜龅絻却娈惓5那闆r,而StackOverflowError和OutOfMemoryError便是最常遇見的錯誤。
首先,看看這兩種錯誤的解釋:
如果當前線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常。 如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常。
這里把異常分為兩種情況,但是存在一些相互重疊的地方:當??臻g無法繼續(xù)分配時,到底是內存太小,還是已經使用的??臻g太大,本質上是對同一個問題的兩種描述而已。
接下來,兩個小例子分別展示如何產生這兩種異常:
OutOfMemoryError異常:
首先設置一下虛擬機啟動參數(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) ......
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
java利用Apache commons codec進行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
這篇文章主要介紹了java利用apache Commons包進行MD5加密,BASE64加密解密與執(zhí)行系統(tǒng)命令希望對大家有用2017-12-12
Spring?Boot使用LocalDateTime、LocalDate作為入參的方案詳解
這篇文章主要介紹了Spring?Boot使用LocalDateTime、LocalDate作為入參,本文基于Springboot2.0測試,如果無法生效可能是spring版本較低導致的,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09
springboot CompletableFuture異步線程池詳解
這篇文章主要介紹了springboot CompletableFuture異步線程池的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Spring原生Rpc六種的正確打開方式實現(xiàn)示例
這篇文章主要為大家展示了Spring原生Rpc六種的正確打開方式實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步早日升職加薪2022-02-02
spring mvc常用注解_動力節(jié)點Java學院整理
這篇文章主要介紹了spring mvc常用注解,詳細的介紹了@RequestMapping, @RequestParam, @ModelAttribute等等這樣類似的注解,有興趣的可以了解一下2017-08-08
詳解用Kotlin寫一個基于Spring Boot的RESTful服務
這篇文章主要介紹了詳解用Kotlin寫一個基于Spring Boot的RESTful服務 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

