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;
}
}
}
具体实现的验证代码如上所示: