Java 如何在不访问JVM设置的情况下扩展堆栈大小?

Java 如何在不访问JVM设置的情况下扩展堆栈大小?,java,jvm,stack-overflow,jvm-arguments,Java,Jvm,Stack Overflow,Jvm Arguments,我没有权限访问JVM设置,因为我正在提交要在其他地方运行的代码,所以我无法遵循其他关于扩展堆栈大小的堆栈溢出回答。有什么方法可以从我的Java文件中执行吗 我想这样做的原因(不是很重要): 我在一个有10^5个节点的树上使用递归。一般情况下是可以的,但不能保证树的形状。我正在处理一个边缘案例,树只是一条长长的线。我得到了一个StackOverflower错误,但是如果我能扩展我的堆栈大小,我的算法就会运行良好。我曾经考虑过通过找到树的质心或使用稀疏矩阵来处理这种情况,但我更愿意将堆栈大小增加一倍

我没有权限访问JVM设置,因为我正在提交要在其他地方运行的代码,所以我无法遵循其他关于扩展堆栈大小的堆栈溢出回答。有什么方法可以从我的Java文件中执行吗

我想这样做的原因(不是很重要):

我在一个有10^5个节点的树上使用递归。一般情况下是可以的,但不能保证树的形状。我正在处理一个边缘案例,树只是一条长长的线。我得到了一个StackOverflower错误,但是如果我能扩展我的堆栈大小,我的算法就会运行良好。我曾经考虑过通过找到树的质心或使用稀疏矩阵来处理这种情况,但我更愿意将堆栈大小增加一倍并使用现有代码。

总结这些评论,您可以创建一个新线程并指定堆栈大小,尽管文档说效果高度依赖于平台(至少可以在我的计算机上工作)。请参阅此处的详细信息:

例如:

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; }
}

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

总结评论,您可以创建一个新线程并指定堆栈大小,尽管文档说效果高度依赖于平台(至少在我的计算机上工作)。请参阅此处的更多信息:

例如:

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; }
}

(更改stacksize,您将看到更高的递归深度)

将算法更改为迭代算法不是更好吗?堆栈在JVM启动时设置,因此除非“别处”设置提供了一种调整它的方法,然后没有。@JavaMan是的,这可能是我要做的,但是我需要更改的东西太多了,所以我试图避免使用itOr。您可以将当前状态存储在
堆栈
实例中。当然,在这种情况下,您不能使用递归,必须手动维护堆栈操作。您可以它是受尊重的,或者您需要的堆栈大小是特定于实现的。后者甚至可能在同一运行时更改。请参阅,将算法更改为迭代算法不是更好吗?堆栈是在JVM启动时设置的,因此,除非“其他地方”提供了一种调整它的方法,然后没有。@JavaMan是的,这可能是我要做的,但是我需要更改的东西太多了,所以我试图避免使用itOr。您可以将当前状态存储在
堆栈
实例中。当然,在这种情况下,您不能使用递归,必须手动维护堆栈操作。您可以它是受尊重的,或者您需要的堆栈大小是特定于实现的。后者甚至可能在同一运行时更改。请参阅