当堆栈溢出时,JVM会抛出StackOverflowException。
这很好,但不足以达到我的目的。
我想知道我是否有足够的堆栈来完成某个计算。即,我想知道我的程序是否接近但尚未耗尽堆栈空间。
答案 0 :(得分:0)
我认为你不能在vm中查询当前的堆栈大小。但是你可以通过保持你正在创建的任何局部变量的总大小来跟踪自己。
可以使用-Xss选项(即:java -Xss4m)
设置堆栈大小答案 1 :(得分:0)
不幸的是,这最多可以接近,因为每个堆栈都是自己的大小。
然而,如果你知道你要调用的函数的平均帧大小,你可以这样做:
// assuming you'll need space for 4 references per frame on avg.
public static void checker(IntRef x1, Object x2, Object x3, Object x4) {
x1.incr();
checker(x1, x3, x4, x2);
}
class IntRef {
public int frames = 0;
void incr() { frames++; }
}
num = new IntRef();
try {
checker(num, "a", "b", "c");
}
catch (StackOverFlowException ex) {
// surprise :)
}
System.out.println("We can do approximately " ++ num.frames ++ " frames.");
希望这会有所帮助。 请注意,对于通常的堆栈大小,此检查几乎不需要时间。