一、虚拟机栈
Java虚拟机栈(Java Virtual Machine Stacks) 是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)。每个方法从被调用到完成,就对应这一个栈帧在虚拟机栈的入栈到出栈的过程。
虚拟机栈隔离的,每个线程都有自己独立的虚拟机栈。
在 Java 虚拟机规范中,对虚拟机栈这个区域规定了两种异常状况:
1. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常;
2. 如果虚拟机栈可以动态扩展(当前大部分的 Java 虚拟机都可动态扩展),在扩展时无法申请到足够的内存时会抛出 OutOfMemoryError 异常。
二、虚拟机的 StackOverflowError 异常
通过-Xss参数减小栈内存的容量,然后不断调用方法造成栈溢出。利用第一种异常状况抛出StackOverflowError 异常。
public class JVMStackSOF {
private int stacklength = 1; // 记录栈深度
// 调用这个递归方法以造成栈溢出
public void stackPush(){
stacklength++;
stackPush(