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

相关文章
相关标签/搜索