【问题标题】:Java stack overflow on computing SCC on large graph在大图上计算 SCC 时的 Java 堆栈溢出
【发布时间】:2012-04-29 00:24:41
【问题描述】:

我有一个包含近 1 百万个节点的图,我在其上计算强连通分量。我已将 vm 的堆大小增加到 10240 mb,但它仍然抛出此异常:

Error: 875714
Exception in thread "main" java.lang.StackOverflowError
    at java.util.Stack.push(Stack.java:67)

我绝对确定问题不是代码,而是大小。我还能做什么?

更新:无论我设置 vm 的堆大小如何,都会在 6 秒后引发 StackOverflowError。

如果我无法解决 StackOverflow.com 上的 StackOverflowError,我不知道还能去哪里 =)

【问题讨论】:

  • 您需要包含更多代码。如果您使用递归调用,您可能需要更改代码以使用常规循环。
  • 好吧,你为什么不首先增加堆栈大小呢?谷歌一下。
  • 堆大小不会影响 StackOverflowErrors,因为线程堆栈内存不是堆的一部分。您可以增加线程堆栈大小,但这是一个不同的 JVM 选项,我相信 -Xss。

标签: java graph stack stack-overflow


【解决方案1】:

请记住,StackOverflowErrorjava.util.Stack 无关:当调用堆栈没有更多空间(即递归太深)时抛出错误,而不是当 Stack 中没有空间时对象。

我建议的第一件事是修改算法。我的盲目猜测是您正在使用递归来访问邻居节点,这会导致溢出。尝试使用循环代替递归。

出于短期目的,您还可以尝试使用-Xss 增加堆栈大小(而不是堆大小)。顺便说一句,请记住每个线程都有自己的堆栈。

【讨论】:

    【解决方案2】:

    不要将StackOverflowErrorOutOfMemoryError 混淆。 StackOverflowError 出现在“when an application recurses too deeply”,而OutOfMemoryError 出现在“no more memory could be made available by the garbage collector”时。

    既然您得到StackOverflowErrors,请尝试找到一个可以将一些递归转换为循环的位置。这应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2017-09-29
      • 2012-08-09
      • 2018-06-16
      • 1970-01-01
      • 2013-07-11
      • 2019-02-02
      • 2019-05-18
      • 2015-07-26
      相关资源
      最近更新 更多