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

posted on 2019-09-24 22:24  周健康  阅读(1638)  评论(0编辑  收藏  举报

导航