• 什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明


    什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明

    、 栈溢出(StackOverflowError)
    栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化)

    所以我们可以理解为栈溢出就是方法执行是创建的栈帧超过了栈的深度。那么最有可能的就是方法递归调用产生这种结果。

    public class JvmTest {
    private int i = 0;
    public void a(){
    System.out.println(i++);
    a();
    }
    public static void main(String[] args) {
    JvmTest j = new JvmTest();
    j.a();
    }
    }
    输出结果:

    如何解决:

    我们需要使用参数 -Xss 去调整JVM栈的大小

    解决后效果如下

    但是需要注意递归程序的风险。

    二、 堆溢出(OutOfMemoryError:java heap space)
    heap space表示堆空间,堆中主要存储的是对象。如果不断的new对象则会导致堆中的空间溢出

    public class JvmTest {
    public static void main(String[] args) {
    List<String> aList = new ArrayList<String>();
    try{
    while(true){
    aList.add("asdasdasdas");
    }
    }catch(Throwable e){
    System.out.println(aList.size());
    e.printStackTrace();
    }
    }
    }
    异常信息:

    可以通过 -Xmx4096M 调整堆的总大小

    三、 永久代溢出(OutOfMemoryError: PermGen space)
    由于JDK7、8移除永久带,所以上述代码在JDK1.6的情况中会出现永久带溢出的现象。

     
    ---------------------
    作者:LJHSkyWalker
    来源:CSDN
    原文:https://blog.csdn.net/qq_31615049/article/details/82980799
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    bzoj1644 [Usaco2007 Oct]Obstacle Course 障碍训练课
    bzoj1640 [Usaco2007 Nov]Best Cow Line 队列变换
    bzoj1639 [Usaco2007 Mar]Monthly Expense 月度开支
    bzoj1637 [Usaco2007 Mar]Balanced Lineup
    bzoj1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
    bzoj1635 [Usaco2007 Jan]Tallest Cow 最高的牛
    bzoj1638 [Usaco2007 Mar]Cow Traffic 奶牛交通
    bzoj3407 [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题
    bzoj1631 [Usaco2007 Feb]Cow Party
    bzoj1632 [Usaco2007 Feb]Lilypad Pond
  • 原文地址:https://www.cnblogs.com/handsome1013/p/10759574.html
Copyright © 2020-2023  润新知