深入理解Java虚拟机jvm-栈溢出-栈帧过多java.lang.StackOverflowError

栈溢出

  • 示例
  • 虚拟机参数
  • 结果
  • 原因分析

示例

/**
 * 栈溢出
 * 栈帧过多,栈内存过小
 * 每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧[1](Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
 * java.lang.StackOverflowError
 * 输出:stack length:2110
 */
public class Demo2 {
    private int stackLength = 1;

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

    public static void main(String[] args) {
        Demo2 oom = new Demo2();
        try {
            oom.stackLeak();
        } catch (Throwable e) {
            System.out.println("stack length:" + oom.stackLength);
            throw e;
        }
    }
}

虚拟机参数

-Xss128k
解释:

  • -Xss128k:线程栈的大小为128KB

结果

深入理解Java虚拟机jvm-栈溢出-栈帧过多java.lang.StackOverflowError_第1张图片

原因分析

此次异常,可以知道该线程在创建了2106个栈帧后再次创建栈帧时发生异常,原因是创建的栈帧的内存达到了最大值,无法申请新的内存,异常

你可能感兴趣的:(jvm,java,开发语言)