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

1,Out Of Memery 內存耗盡

1,1 產生緣由

  1.1.1  內存用完【堆內存】java

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/81258480app

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

相關文章
相關標籤/搜索