1.JVM内存溢出之虚拟机栈和本地方法栈溢出

1.

理论支持依据有:

 当方法被调用的时候,创建栈帧,并压入虚拟机栈,方法执行完毕之后
* 栈阵出栈并且被销毁

详细过程如下图所示:

虚拟机栈有一个十分明显的特点是隔离性是十分的好的:

每个线程都有自己独立的虚拟机栈

其中虚拟机栈的StackOverflowError原理如下所示:

  若单个线程请求的栈深度大于虚拟机允许的深度,则会抛出StackOverflowError(栈溢出错误)

JVM会为每个线程的虚拟机栈分配固定大小的内存(-Xss参数)。所以栈能够容纳的栈帧数量是有限的,若栈帧不断进栈而不出栈,最终会导致当前线程虚拟机栈的内存空间耗尽,典型如一个无结束条件的递归函数调用,

递归函数调用代码实现如下所示:

具体过程如下所示:

显示如下所示:

由于内部定义的是一个void的内部无返回值的构造方法,会不断的去迭代自己本身的构造方法,也就是内部迭代的一个过程

/**
 * 虚拟机栈内存溢出测试。栈内存也就是我们经常说的虚拟机内存
 * 可以理解为虚拟机中栈顶指针的局部变量集合
 *
 *
 */
public class javaVMStackSOF {
private int stacklength=1;
public void stackleak(){
    stacklength ++;
    stackleak();//不断的去内存调用,也就是自己不断的去调用自己
    //通过不断往栈中压入方法来实现。定义void 参数来实现不断的内部调用
}

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;
    }
}
}

具体实现的验证代码如上所示:

猜你喜欢

转载自blog.csdn.net/qq_35561207/article/details/84394619