【问题标题】:StackOverflowError While in SBT's Compile在 SBT 的编译中出现 StackOverflowError
【发布时间】:2013-05-04 23:01:19
【问题描述】:

在构建时(使用 compile 或 test:compile),我收到此错误:

[info] [specializing CorrelationDal.scala]
[error] {file:/home/bamboo/.../}batch/compile:compile: java.lang.StackOverflowError
[error] Total time: 20 s, completed Feb 28, 2012 7:32:08 AM

如您所知,我在 scalacOption 键中设置了“-verbose”选项。

我决定尝试使用以下方法为编译过程提供更大的堆栈大小:

(fork := true) ++ (javaOptions += "-Xss4G")

但这并没有改变。

我试图检查我对 CorrelationDal.scala 所做的更改,并尝试放宽它需要做的推理量(明确指出类型、删除可迭代的链式创建等),但我不能如果没有对 Scala 编译器的内部理解,就无法真正分辨出哪些是罪魁祸首。

有没有人知道如何找到问题的核心?

【问题讨论】:

  • 您是否尝试过手动编译?能不能隔离编译单元的源码中触发栈溢出的部分?
  • 我正在努力。更令人难以置信的是,在本地(在我的 MacOSX Lion 机器上)它工作得很好,但在 Amazon Elastic 实例上却失败了。

标签: scala build sbt


【解决方案1】:

我在sbt脚本文件中加上-Xss2M后就OK了。

【讨论】:

    【解决方案2】:

    原来这是字符串连接的问题。如果你连接的字符串太多,像这样:

    "string" + "other string" + variable + "string" + ...
    

    你会明白这一点的。我认为这是因为编译器中的类型推断机制过于努力。希望它会在未来的版本中得到修复(我使用的是 2.9.1...)

    【讨论】:

    • 该序列是否以变量开头?这对我来说很有意义。无论如何,我假设您没有对这些变量中的任何一个调用.toString,它们本身不是String?我想看一个例子——这可能值得进一步调查。
    • 它不以变量开头,并且将.toString 放在所有不是以字符串开头的变量上并没有什么区别。
    • 在这种情况下,我会用你能想到的最小例子开一张票。它可能会因为无法修复而关闭,但记录这些内容很有用,此外,它可能不会。 Scala 2.10 最有可能进行字符串插值,这将使这个没有实际意义。
    【解决方案3】:

    那个参数没有意义——你不是在运行,只是在编译。

    您必须更改 SBT 本身的堆栈大小。只需编辑 sbt 脚本并进行更改即可。

    【讨论】:

    • 试过了,也没用。但是 - 编译器不会被分叉并且 javaOptions 也不会发送给它吗?
    • @OmervanKloeten 没有发生分叉,通过查看inspect java-options 显示的反向依赖关系可以看出,它除了runner 之外没有任何用途。现在,如果连 4G 都不够的话,也许你已经创建了一个无限类型推理循环。
    • 感谢您的提示 - 我将删除这些行。仍在检查源代码,但我找不到编译器出了什么问题……有什么建议吗?
    • @OmervanKloeten 删除源代码,直到找到导致问题的一小部分文件。然后,您可以尝试显式声明类型以找出导致问题的推理(假设这确实是问题)。另外,在收到错误后尝试last compile 以检索堆栈跟踪,这可能会有所帮助。
    • 感谢last compile 提示!下次我会用它。但是,您可以从我自己对问题的回答中看到,我已经找到了原因。感谢您的帮助:)
    猜你喜欢
    • 2016-03-22
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多