美文网首页
栈内存溢出

栈内存溢出

作者: Richard_80ec | 来源:发表于2017-12-12 16:51 被阅读0次

计算机中每个操作系统给每个进程的内存是有限制的(windows64位系统中最大分配内存是2G),即对于虚拟机,最大内存是2G,不算虚拟机进程启动时所占用的内存,剩下的内存分配给共享区和线程独享区,共享区的内存大小由虚拟机参数(-Xmx最大堆内存,MaxPermSize最大方法区容量)指定,剩下的则分配给栈空间,程序计数器占用的空间极小可忽略不计,每个线程分配到的栈容量越大,可以建立的线程的数量自然就越少,建立线程时则更容易将内存耗尽。
测试:

public class JavaVMStackSOF {

    private int stackLength = 1;

    public void stackLeak(){
        stackLength ++;
        stackLeak();
    }

    public static void main(String[] args) {
        JavaVMStackSOF oom = new JavaVMStackSOF();

        try {
            oom.stackLeak();
        }catch (Throwable e){
            System.out.println("stack length:" + oom.stackLength);
            throw e;
        }
    }
}

设置虚拟机参数:
-Xss128k :设置每个线程的栈大小,减小这个值,可以使虚拟机创建更多线程
运行结果:

stack length:967
Exception in thread "main" java.lang.StackOverflowError
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:11)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
    at com.example.stackoverflowerror.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)
...

报出虚拟机栈超出虚拟机允许的最大深度的错误(StackOverflowError)。
通过-Xss控制了每个线程的最大栈大小,当栈不断增大时,会暴露栈空间不足的错误,这种错误有两种,一种是上述的栈深度超出,个人理解应该跟数组的outOfIndexError差不多的意思。
另一种就是虚拟机为栈分配的空间不足了,造成内存溢出。
代码:

public class JavaVMStackOOM {

    private void dontStop(){
        while (true){

        }
    }

    public void stackLeakByThread(){
        while (true){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    dontStop();
                }
            });
            thread.start();
        }
    }

    public static void main(String[] args) {
        JavaVMStackOOM javaVMStackOOM = new JavaVMStackOOM();
        javaVMStackOOM.stackLeakByThread();
    }
}

设置虚拟机参数:
-Xss2m 将每个线程分配的空间调大一些
由于java线程是映射到操作系统的内核线程上的,因此上述代码执行有较大风险,可能会导致操作系统假死。本人测试的时候就死机了。。。

相关文章

  • 【笔记】深入理解 java 虚拟机---虚拟机内存溢出

    虚拟机的内存溢出有以下情况: 1 Java 堆内存溢出。 OutOfMemory。 2 栈内存溢出。StatckO...

  • Android面试 内存泄漏连环炮

    面试问题 什么是内存泄露,什么是内存溢出 什么情况下会造成堆溢出、栈溢出 常见造成内存泄露的情况 常见造成内存溢出...

  • 虚拟机栈溢出

    错误原因:java.lang.StackOverflowError 栈内存溢出 栈溢出产生递归调用,循环遍历是不会...

  • 栈内存溢出

    计算机中每个操作系统给每个进程的内存是有限制的(windows64位系统中最大分配内存是2G),即对于虚拟机,最大...

  • java OOM与SOF

    OOM尼玛就是内存不足,SOF就是栈溢出。狂调递归函数就会引起栈溢出,不停申请对象就会导致内存超过上限。

  • 栈内存溢出与堆内存溢出

    栈内存溢出: 原因:递归调用 hibernate中如果where条件过多则报此错误 堆内存溢出: java.lan...

  • java 基础 - 收藏集 - 掘金

    Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因...

  • 栈内存溢出的问题

    制造一个栈内存溢出的问题。 错误原因:因为test()方法不停的进栈,栈的内存不足,就是抛出StackOverfl...

  • 内存泄漏理解

    1.简单理解 内存泄漏指的是堆内存泄漏,栈不会发生内存泄漏,只会发生栈溢出(StackOverFlow)。简单一个...

  • 缓冲区溢出

    知识背景 栈溢出及防护 堆溢出及防护 一、知识背景 关于栈溢出的知识背景 1. 典型操作系统的内存布局: 分段的意...

网友评论

      本文标题:栈内存溢出

      本文链接:https://www.haomeiwen.com/subject/atsgixtx.html