SBT编译导致堆栈溢出错误

12

我最近一直面临这个错误。因为这个问题很烦恼。尝试了stackoverflow和其他网站上看到的所有类似解决方案。

我有4个单独的Scala项目。其中两个最大的项目在编译时会出现StackOverflow错误。当我在Ubuntu服务器上构建项目时,就会遇到这个错误。我尝试在sbt配置文件中增加Xmx选项,但没有成功。

请问有人能帮我解决这个问题吗?因为这个问题让我快要发疯了。如果我多次构建项目,成功率只有1或2次。

从错误日志中我理解到问题源于类型检查。但是我不知道具体出现在哪里。

其中一个失败的项目有1000多个类/特质(不包括case class)。

详情

Ubuntu Server(14)
Sbt : 0.13.6 and 0.13.8 tried
Scala Version : 2.11.6
JDK: 1.8

以下是错误信息的几行:

java.lang.StackOverflowError
    at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:696)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5396)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5423)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5370)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5374)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$96.apply(Typers.scala:4523)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$96.apply(Typers.scala:4523)
    at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:680)
    at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4522)
    at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4578)
    at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5343)
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5360)
    at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:696)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5396)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5423)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5370)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5374)
    at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5472)
    at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5480)
    at scala.tools.nsc.transform.Erasure$Eraser.adaptMember(Erasure.scala:642)
    at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:696)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5396)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5423)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5370)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5374)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$96.apply(Typers.scala:4523)
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$96.apply(Typers.scala:4523)
    at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:680)
    at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4522)
    at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4578)
    at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5343)
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5360)
    at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:696)
    at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5396)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5423)
    at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5370)
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5374)
    at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:3163)
    at scala.tools.nsc.typechecker.PatternTypers$PatternTyper$class.typedArgWithFormal$1(PatternTypers.scala:112)
    at scala.tools.nsc.typechecker.PatternTypers$PatternTyper$$anonfun$2.apply(PatternTypers.scala:115)
    at scala.tools.nsc.typechecker.PatternTypers$PatternTyper$$anonfun$2.apply(PatternTypers.scala:115)
    at scala.runtime.Tuple2Zipped$$anonfun$map$extension$1.apply(Tuple2Zipped.scala:46)
    at scala.runtime.Tuple2Zipped$$anonfun$map$extension$1.apply(Tuple2Zipped.scala:44)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.runtime.Tuple2Zipped$.map$extension(Tuple2Zipped.scala:44)
    at scala.tools.nsc.typechecker.PatternTypers$PatternTyper$class.typedArgsForFormals(PatternTypers.scala:115)
    at scala.tools.nsc.typechecker.Typers$Typer.typedArgsForFormals(Typers.scala:111)
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$handleMonomorphicCall$1(Typers.scala:3469)
    at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3494)
    at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4544)
    at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4578)
    at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5343)
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5360)
    at scala.tools.nsc.transform.Erasure$Eraser.typed1(E

1
你需要更改“-Xss”。尝试使用“-Xss3m”。 - jrudolph
@jrudolph:谢谢。我会添加并尝试看看是否有效。 - Yadu Krishnan
@jrudolph 我在sbtconfig.txt文件中添加了-Xss3m。但是问题仍然存在。 - Yadu Krishnan
可能是重复问题:http://stackoverflow.com/questions/9482243/stackoverflowerror-while-in-sbts-compile - r0estir0bbe
1
在机器上设置您的 SBT_OPTS,这个例子有 -Xss2m 堆栈大小,这是一个相当常见的问题。https://dev59.com/PmUp5IYBdhLWcg3wbXNf#15281562 - Noah
显示剩余3条评论
2个回答

4
据我所知,自2.11.4版本至2.11.6版本,Scala一直存在此问题。在最新的2.11.7版本发布说明中,似乎并未提到已修复该问题。
幸运的是,在问题跟踪器上关注此问题track后,发现这是一个重复的ticket,并且在stack overflow上有答案。
没有源代码更难给出更多指示,但这应该绝对是找到问题并应用所提出的解决方案的好指针。

我正在使用很多泛型,但正如票证中所提到的,我们没有使用任何元素的清单。我尝试了所有与内存相关的设置,但没有用处。 - Yadu Krishnan
你没有提到你还没有清单。无论如何,你可以尝试:a) 在你可能正在使用的库中搜索“Manifest”用法,很可能其中一些正在使用它;b) 将你的项目升级到Scala 2.11.7;c) 向scala-lang.org报告这个错误。 - Jaime Agudo
只是为了明确,我在某些地方使用Manifest进行json反序列化。例如:def extractEntity(json: String)(implicit m: Manifest[E]): E = parse(json).extract[E],其中E是一个名为BaseEntity的trait,具有一些公共字段(id、isActive等)。目前,我正在使用2.11.6版本。我将尝试使用2.11.7版本并检查问题是否存在。 - Yadu Krishnan
如果你的代码中使用了Manifest,我建议你将其替换为TypeTagsClassTags请参见此链接。由于它即将被弃用,Scala开发人员可能不会修复这个错误,正如我所说,它在最近的2.11.7版本说明中并未出现。 - Jaime Agudo
谢谢您的建议。Json4s的extract方法需要将Manifest作为隐式参数传入。我需要尝试在这种情况下如何不使用该方法。 - Yadu Krishnan
我尝试删除所有隐式清单,但问题仍然存在 :( - Yadu Krishnan

0

我尝试了所有的配置更改,但是在机器上没有起作用。所以我跳过了将近一个月。最近,我尝试在Jenkins中构建项目,但是一直出现相同的错误。然后我升级了sbt 0.13.8,并在jenkins构建标志中添加了jvm标志-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx1024M -Xss16M。到目前为止,所有的编译都成功了。 我记得在sbt配置文件中添加jvm标志,但是仍然出现相同的错误。但是现在,在添加了该标志后,jenkins中的工作正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接