【问题标题】:How to extend stack size without access to JVM settings?如何在不访问 JVM 设置的情况下扩展堆栈大小?
【发布时间】:2020-11-13 23:28:54
【问题描述】:

我无权访问 JVM 设置,因为我正在提交要在其他地方运行的代码,因此我无法遵循有关扩展堆栈大小的其他 Stack Overflow 答案。有什么方法可以从我的 Java 文件中执行此操作吗?

我想这样做的原因(不是很重要):
我在具有 10^5 个节点的树上使用递归。一般情况下是可以的,但不能保证树的形状。我正在处理一种边缘情况,即树只是一条长线。我得到一个 StackOverflowError,但如果我可以扩展我的堆栈大小,我的算法将运行良好。我虽然通过查找树的质心或使用稀疏矩阵来处理这种情况,但我更愿意将堆栈大小加倍并使用我现有的代码。

【问题讨论】:

  • 算法改成迭代算法不是更好吗?
  • 堆栈是在 JVM 启动时设置的,所以除非“其他地方”提供了调整它的方法,否则不会。
  • @JavaMan 是的,这可能是坏事,但我需要改变很多东西,我试图避免它
  • 或者您可以将当前状态存储在Stack 实例中。当然,在这种情况下你不能使用递归,必须手动维护堆栈操作。
  • 你可以construct a new thread with an explicit stack size。但是,无论它是否受到尊重或您需要多少堆栈大小,都是特定于实现的。后者甚至可能在同一运行时发生变化。见Why is the max recursion depth I can reach non-deterministic?

标签: java jvm stack-overflow jvm-arguments


【解决方案1】:

总结 cmets,您可以创建一个新线程并指定堆栈大小,尽管文档说效果高度依赖于平台(至少在我的计算机上有效)。在此处查看更多信息:https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Thread.html#%3Cinit%3E(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String,long)

例子:

public static void main(String[] args)
{
    Thread thread1 = new Thread(null, null, "qwer", 1000000) {
        public void run() {
            System.out.println(countDepth());
        }
    };
    thread1.start();
}
public static int countDepth() {
    try {return 1+countDepth();}
    catch(StackOverflowError err) { return 0; }
}

(更改堆栈大小,您将看到更高的递归深度)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多