关于 Java VM 堆栈溢出
About Java VM Stack Overflow
谢谢!
我在学习JVM,测试VM栈溢出,发现一个奇怪的现象。
我通过两种方式递归调用方法,但我对结果感到困惑。
虚拟机选项:-Xss108k -Xms10m -Xmx10m
方法中只有一个堆栈深度计数器。
screenshot 1
我在方法中定义了数组,堆栈更深。
screenshot 2
public class T2 {
private int stackLength = 1;
public void stackLeak(){
long[] a = new long[2000]; //define this array or not
stackLength++;
stackLeak();
}
public static void main(String[] args) {
T2 oom = new T2();
try{ //
oom.stackLeak();
} catch(Throwable e){
System.out.println("stack length: " + oom.stackLength);
e.printStackTrace();
} finally{
}
}
}
我已经重运行很多次了,结果都差不多。
我想,数组保存在堆中,它不会影响 VM 堆栈,但确实如此。
数组分配影响程序的执行时间。程序越长 运行s,JIT 编译器启动的机会就越大,程序将继续以编译模式执行。
堆栈深度的差异由后台JIT编译解释。有关详细信息,请参阅 。
为了进行公平比较,运行 JVM 关闭了 JIT 编译:-Xint
。在这种情况下,数组分配将使最大递归深度预期更小(因为将多一个堆栈槽用于数组引用)。
谢谢!
我在学习JVM,测试VM栈溢出,发现一个奇怪的现象。 我通过两种方式递归调用方法,但我对结果感到困惑。
虚拟机选项:-Xss108k -Xms10m -Xmx10m
方法中只有一个堆栈深度计数器。 screenshot 1
我在方法中定义了数组,堆栈更深。 screenshot 2
public class T2 {
private int stackLength = 1;
public void stackLeak(){
long[] a = new long[2000]; //define this array or not
stackLength++;
stackLeak();
}
public static void main(String[] args) {
T2 oom = new T2();
try{ //
oom.stackLeak();
} catch(Throwable e){
System.out.println("stack length: " + oom.stackLength);
e.printStackTrace();
} finally{
}
}
}
我已经重运行很多次了,结果都差不多。 我想,数组保存在堆中,它不会影响 VM 堆栈,但确实如此。
数组分配影响程序的执行时间。程序越长 运行s,JIT 编译器启动的机会就越大,程序将继续以编译模式执行。
堆栈深度的差异由后台JIT编译解释。有关详细信息,请参阅
为了进行公平比较,运行 JVM 关闭了 JIT 编译:-Xint
。在这种情况下,数组分配将使最大递归深度预期更小(因为将多一个堆栈槽用于数组引用)。