我创建了一个java程序来计算无穷大:
class up { public static void up (int n) { System.out.println (n) ; up (n+1) ; } public static void main (String[] arg) { up (1) ; } }
我实际上没想到它会到达那里,但我发现有点好奇的是它每次停在相同的数字:518669
这个号码有什么意义?(或者我想这个数字+1).
除了显然518669乘以该方法的堆栈大小等于系统上的总可用堆栈空间之外,该数字本身没什么意义.
这个特定值并不重要,这是您本地设置的结果.您重复获得相同的值是重要且可预测的.
您的程序在此时始终崩溃,因为每次运行程序时,Java虚拟机都会以相同的参数启动,然后执行相同的操作,直到堆栈空间消失为止.
您可以更改两者,并更改结果.
您可以通过传递-Xss标志来更改JVM可用的最大堆栈大小,例如:
java -Xss4096k MyClass
在我的机器上,使用我的默认启动参数,在10,518个递归调用之后,我的堆栈空间用完了.我认为我的设置默认为1024k.
如果我如上所述将最大堆栈大小设置为4096k,我可以在堆栈溢出之前获得50,777个递归调用.
您还可以向方法添加更多操作或不同操作,每次调用消耗更多空间并更改可能的调用次数.
如果我MyClass myClass = new MyClass();
在println语句之后将语句添加到代码(每次调用的MyClass的本地实例),那么在溢出之前我可以进行的调用次数从10,518减少到9,709,因为每次调用时对MyClass实例的引用都有存储.