-Xss128k:这个JVM参数用来配置栈的大小为128k
因为栈是线程私有的(不清楚的可以去了解下JVM虚拟机结构),所以如果我们启动一个线程,并且在这个线程中调用一个递归,就会产生该异常。
/** * VM Args:-Xss128k * */ public class JavaVMStackSOF { private int stackLength = 1; public void stackLeak() { stackLength++; stackLeak(); } public static void main(String[] args) throws Throwable { JavaVMStackSOF oom = new JavaVMStackSOF(); try { oom.stackLeak(); } catch (Throwable e) { System.out.println("stack length:" + oom.stackLength); throw e; } } }
分析:
1.主线程中调用JavaVMStackSOF的stackLeak()方法 而在stackLeak()中也是调用自身
2.每调用自身一次就会生成一个栈帧(栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)),所以会占用一定的空间
3.我们设置的-Xss128k 也就是说主线程的栈空间只有128k。当栈空间不足的时候就会爆出OOM异常 - Exception in thread "main" java.lang.StackOverflowError
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-13 18:11:48