3

The setup for my environment is SBT 1.3.0-RC1, Scala 2.12.8 and Java 1.8.0_212. The SBT threw an exception during compile,

[IJ]sbt:foobar> compile
[info] Compiling 15 Scala sources and 1 Java source to U:\workspace\foobar\target\scala-2.12\classes ...
[error] ## Exception when compiling 16 sources to U:\workspace\foobar\target\scala-2.12\classes
[error] null
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1374)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1432)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1381)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1383)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.api.Trees$Transformer.$anonfun$transformStats$1(Trees.scala:2597)
[error] scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2595)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1402)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.internal.Trees.$anonfun$itransform$2(Trees.scala:1399)
[error] scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2608)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1397)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.api.Trees$Transformer.$anonfun$transformStats$1(Trees.scala:2597)
[error] scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2595)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1440)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:2571)
[error] scala.reflect.internal.Trees.$anonfun$itransform$4(Trees.scala:1444)
[error] scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2608)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1443)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.api.Trees$Transformer.$anonfun$transformStats$1(Trees.scala:2597)
[error] scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2595)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1402)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1703)
[error] scala.reflect.internal.Trees.itransform(Trees.scala:1436)
[error] scala.reflect.internal.Trees.itransform$(Trees.scala:1372)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:27)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2563)
[error] scala.reflect.internal.Trees$Duplicator.transform(Trees.scala:1706)
[error] scala.reflect.internal.Trees.duplicateAndKeepPositions(Trees.scala:1739)
[error] scala.reflect.internal.Trees.duplicateAndKeepPositions$(Trees.scala:1739)
[error] scala.reflect.internal.SymbolTable.duplicateAndKeepPositions(SymbolTable.scala:27)
[error] scala.tools.nsc.typechecker.Macros$MacroExpander.$anonfun$expand$1(Macros.scala:638)
[error] scala.tools.nsc.Global.withInfoLevel(Global.scala:227)
[error] scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:625)
[error] scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:612)

...

[error]         at scala.tools.nsc.Global.withInfoLevel(Global.scala:227)
[error]         at scala.tools.nsc.typechecker.Macros$MacroExpander.expand(Macros.scala:625)
[error]         at scala.tools.nsc.typechecker.Macros$MacroExpander.apply(Macros.scala:612)
[error]         at scala.tools.nsc.typechecker.Macros.standardMacroExpand(Macros.scala:787)
[error]         at scala.tools.nsc.typechecker.Macros.standardMacroExpand$(Macros.scala:785)
[error]         at scala.tools.nsc.Global$$anon$4.standardMacroExpand(Global.scala:477)
[error]         at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:439)
[error]         at scala.tools.nsc.typechecker.AnalyzerPlugins$$anon$12.default(AnalyzerPlugins.scala:436)
[error] (Compile / compileIncremental) java.lang.StackOverflowError

The same error occurred for running command-line SBT. How do I fix this? Thanks

Updates #1

TL;DR Increase SBT thread stack size i.e. SBT_OPTS="-Xss2m" sbt clean compile

My project uses PureConfig and it is compiler heavy. Increasing the memory footprint clear the compiler from overflow exception. Case in point, my case class has a List or Option nested case class in its parameter. Coincidentally, the nested case class has a List or Option in its constructor,

case class Foo(bars: List[Bar])
case class Bar(name: String, url: Option[URL])

This will cause the compiler to throw a StackOverflowException. But with additional memory given to SBT, the compilation will go thru.

Community
  • 1
  • 1
thlim
  • 2,908
  • 3
  • 34
  • 57

1 Answers1

2

Run sbt with -mem flag.

sbt -mem 2048 compile

Doing this solved my problem when I get the same error few months before.

If running with -mem flag do not help you can also try increasing the JVM stack size.

-Xss256m -Xmx4096m

Update

Sometimes, missing build.properties in your project also gives the stackoverflow error. If it's missing add:

  build.properties with your sbt-version

Update 2

If you are using PureConfig

PureConfig is a "compiler-heavy" library So, the Scala compiler lacks the resources to do a derivation that complex.So, try this

SBT_OPTS="-Xms512m -Xmx1536m -Xss2m"
MilanRegmi
  • 499
  • 3
  • 12
  • Does 2048 refer to 2mb or 2gb? – thlim Jul 25 '19 at 06:12
  • 2048 means 2gb memory allocated. – MilanRegmi Jul 25 '19 at 06:15
  • No didn't work either. I'm reverting "line by line" until it compiles again. So far, while reverting my changes, I only manage to build the project in intellij but not in sbt command line. – thlim Jul 26 '19 at 01:00
  • missing build.properties in your project also gives the same error, if it's missing check for the update part above. – MilanRegmi Jul 26 '19 at 04:00
  • Your suggestion to add memory helps. This is a small application but `pureconfig` being a compiler heavy library requires more memory. Please refer to my additional comment in my post for details. – thlim Jul 28 '19 at 04:13
  • Yes, PureConfig is a "compiler-heavy" library So, the Scala compiler lacks the resources to do a derivation that complex. `SBT_OPTS="-Xms512m -Xmx1536m -Xss2m"` This is the way to solve your problem as you have already said it works. Now, I actually didn't understand what you are asking for when the problem is already fixed? – MilanRegmi Jul 28 '19 at 05:02
  • i don't know `pureconfig` lib was the culprit until i narrowed down the search. FYI `-mem` does not work – thlim Jul 28 '19 at 05:07
  • 1
    If you don't want to increase the memory, Some people also suggest to use the sbt-extras script for launching SBT, which provides way more reasonable defaults. I haven't use sbt-extras and and I am not much familiar about that so I will recommend to increase the memory. – MilanRegmi Jul 28 '19 at 05:10
  • I suggested -mem because you haven't mentioned about pureconfig before. – MilanRegmi Jul 28 '19 at 05:12
  • You can try sb-extras hope this could help you. https://github.com/paulp/sbt-extras – MilanRegmi Jul 28 '19 at 05:15
  • I realized it is not necessary to increase SBT memory size, increase the thread stack size alone is enough i.e. "-Xss2m" for my case. YMMV – thlim Jul 28 '19 at 10:54