OOM與StackOverFlow發生的原因及解決辦法【待完成】


1,Out Of Memery 內存耗盡

1,1 產生原因

  1.1.1  內存用完【堆內存】

package com.cnblogs.mufasa;

import org.junit.Test;

import java.util.ArrayList;

public class Model {

    @Test
    public void test(){
        ArrayList<Integer> arr=new ArrayList<>();
        while (true){
            arr.add(1);
        }
    }
}
/*
java.lang.OutOfMemoryError: Java heap space
 */

  1.1.2  沒有退出的遞歸調用

 

  1. 如果我們寫一段程序不斷的進行遞歸調用,而且沒有退出條件,就會導致不斷地進行壓棧。類似這種情況,JVM 實際會拋出 StackOverFlowError;當然,如果 JVM 試圖去擴展棧空間的的時候失敗,則會拋出 OutOfMemoryError。
  2. 對於老版本的 Oracle JDK,因為永久代的大小是有限的,並且 JVM 對永久代垃圾回收(如,常量池回收、卸載不再需要的類型)非常不積極,所以當我們不斷添加新類型的時候,永久代出現 OutOfMemoryError 也非常多見,尤其是在運行時存在大量動態類型生成的場合;類似 Intern 字符串緩存占用太多空間,也會導致 OOM 問題。對應的異常信息,會標記出來和永久代相關:“java.lang.OutOfMemoryError: PermGen space”。
  3. 隨着元數據區的引入,方法區內存已經不再那么窘迫,所以相應的 OOM 有所改觀,出現 OOM,異常信息則變成了:“java.lang.OutOfMemoryError: Metaspace”。

1,2 如何解決

 

1,3 注意事項

 

2,Stack Over Flow 堆棧溢出

2,1 產生原因

 

package com.cnblogs.mufasa.SOF;

import org.junit.Test;

public class SOF_validate1 {
    public void recursive(){
        int cnt=0;
        StringBuilder sb=new StringBuilder();
        while (cnt<1){
            sb.append(new String(""+cnt));
            cnt++;
        }
        recursive();
    }

    @Test
    public void test(){
        recursive();//沒有退出條件的遞歸
    }
}
/*
java.lang.StackOverflowError
 */

 

 

2,2 如何解決

 

2,3 注意事項

 

 

https://blog.csdn.net/qq_16973111/article/details/81258480

https://blog.csdn.net/sunquan291/article/details/79109197


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM