Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Java虚拟机堆栈溢出_Java_Jvm_Stack Overflow - Fatal编程技术网

关于Java虚拟机堆栈溢出

关于Java虚拟机堆栈溢出,java,jvm,stack-overflow,Java,Jvm,Stack Overflow,谢谢 我在学习JVM,并测试VM堆栈溢出,发现了一个奇怪的现象。 我以两种方式递归调用一个方法,但我对结果感到困惑 VM选项:-Xss108k-Xms10m-Xmx10m 方法中只有堆栈深度计数器。 我在方法中定义了数组,堆栈越深。 公共类T2{ 私有int stackLength=1; 公共漏洞{ long[]a=new long[2000];//是否定义此数组 stackLength++; stackLeak(); } 公共静态void main(字符串[]args){ t2oom=

谢谢

我在学习JVM,并测试VM堆栈溢出,发现了一个奇怪的现象。 我以两种方式递归调用一个方法,但我对结果感到困惑

VM选项:-Xss108k-Xms10m-Xmx10m

  • 方法中只有堆栈深度计数器。

  • 我在方法中定义了数组,堆栈越深。

公共类T2{
私有int stackLength=1;
公共漏洞{
long[]a=new long[2000];//是否定义此数组
stackLength++;
stackLeak();
}
公共静态void main(字符串[]args){
t2oom=新T2();
试试{//
oom.stackLeak();
}捕获(可丢弃的e){
System.out.println(“堆栈长度:+oom.stackLength”);
e、 printStackTrace();
}最后{
}
}
}
我重新运行了很多次,结果几乎相同。
我认为,数组保存在堆中,不会影响VM堆栈,但确实如此。

数组分配会影响程序的执行时间。程序运行的时间越长,JIT编译器启动的机会就越大,程序将继续以编译模式执行

堆栈深度的差异可以通过后台JIT编译来解释。有关详细信息,请参阅


要进行公平比较,请在禁用JIT编译的情况下运行JVM:
-Xint
。在这种情况下,数组分配将使最大递归深度预期更小(因为将有一个以上的堆栈槽用于数组引用)。

不要将代码和结果作为屏幕截图发布。1) 很多人看不懂截图!!(由于残疾、审查等原因)2)截图可能会被删除,使问题变得毫无意义。3) 我们无法从截图中复制和粘贴。编辑您的问题,并将代码和结果复制粘贴到您的问题中。请参见。这一问答解释了这一点。当数组位于堆上时,包含数组引用的变量位于堆栈上。但即使没有变量,仍然会出现堆栈溢出,因为存在堆栈帧开销。框架必须包含1)指向上一个堆栈框架的指针,以及2)当前方法调用的返回地址。Stephen C-----感谢您提醒meAlso值得一读:非常感谢,您的评论和链接非常有用,我现在很清楚。