如何增加 Java 堆栈大小(Xss 参数)
要增加 JVM 中运行时堆栈的容量,请使用 '-Xss ' 具有适当值的命令行标志。对于 'TT' 程序 (1
$ javac TT.java $ java -Xss4m TT
'-X...' 标志的实现依赖
请注意,“-X...”标志是特定于实现的。在提供的 Java 版本中,“-Xss”标志控制所有线程的堆栈大小。
线程特定的堆栈分配
或者,您可以分配一个慷慨的堆栈大小。使用 java.lang.Thread.stackSize() 方法指定特定线程的堆栈大小。这种方法是有利的,因为它可以防止具有适度堆栈要求的线程的内存浪费。
确定堆栈要求
要衡量程序所需的堆栈大小,请迭代运行它随着堆栈大小的增加,直到它成功执行且没有“StackOverflowError”。对于“TT”程序,堆栈大小确定如下:
-Xss4m: suffices for (1 << 15) -Xss5m: suffices for (1 << 17) ... -Xss515m: suffices for (1 << 25)
非确定性堆栈要求现象
由于以下因素,堆栈要求可能会表现出不确定性行为垃圾收集和 JIT 执行计时。要精确计算达到的堆栈深度,请参阅下面的答案(使用 Javassist)。
替代实现
考虑堆栈消耗更少的替代算法。对于“fact”函数,可以利用迭代实现来避免递归并减少堆栈使用:
public class TTIterative { // ... implementation ... }
BigInteger 注意事项
“fact”函数不能由于溢出,使用“long”数据类型计算大于 65 的数字的精确阶乘。重构函数以返回“BigInteger”可以解决此问题,并为较大的输入提供准确的结果。
以上是如何增加 Java 堆栈大小并避免 StackOverflowError?的详细内容。更多信息请关注PHP中文网其他相关文章!