35

I am frequently getting an OutOfMemoryError from SBT.

> test
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
[error] Use 'last' for the full log.
> last
[debug] Running task... Cancelable: false, check cycles: false
[debug]
[debug] Initial source changes:
[debug]     removed:Set()
[debug]     added: Set()
[debug]     modified: Set()
[debug] Removed products: Set()
[debug] Modified external sources: Set()
[debug] Modified binary dependencies: Set()
[debug] Initial directly invalidated sources: Set()
[debug]
[debug] Sources indirectly invalidated by:
[debug]     product: Set()
[debug]     binary dep: Set()
[debug]     external source: Set()
[debug] Initially invalidated: Set()
[debug] Copy resource mappings:
[debug]
[debug]
[debug] Initial source changes:
[debug]     removed:Set()
[debug]     added: Set()
[debug]     modified: Set()
[debug] Removed products: Set()
[debug] Modified external sources: Set()
[debug] Modified binary dependencies: Set()
[debug] Initial directly invalidated sources: Set()
[debug]
[debug] Sources indirectly invalidated by:
[debug]     product: Set()
[debug]     binary dep: Set()
[debug]     external source: Set()
[debug] Initially invalidated: Set()
[debug] Copy resource mappings:
[debug]
[debug] Framework implementation 'org.scalacheck.ScalaCheckFramework' not present.
[debug] Framework implementation 'org.specs.runner.SpecsFramework' not present.
[debug] Framework implementation 'org.scalatest.tools.ScalaTestFramework' not present.
[debug] Framework implementation 'com.novocode.junit.JUnitFramework' not present.
[debug] Subclass fingerprints: Stream((org.specs2.specification.SpecificationStructure,false,org.specs2.runner.Fingerprints$$anon$1@34d6488c), ?)
[debug] Annotation fingerprints: Stream()
[debug] Running Test ExpandoObjectTest : subclass(false, org.specs2.specification.SpecificationStructure) with arguments
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
    at java.util.concurrent.FutureTask.get(FutureTask.java:111)
    at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:196)
    at sbt.Execute.next$1(Execute.scala:85)
    at sbt.Execute.processAll(Execute.scala:88)
    at sbt.Execute.runKeep(Execute.scala:68)
    at sbt.EvaluateTask$.run$1(EvaluateTask.scala:162)
    at sbt.EvaluateTask$.runTask(EvaluateTask.scala:177)
    at sbt.Aggregation$$anonfun$4.apply(Aggregation.scala:46)
    at sbt.Aggregation$$anonfun$4.apply(Aggregation.scala:44)
    at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:137)
    at sbt.Aggregation$.runTasksWithResult(Aggregation.scala:44)
    at sbt.Aggregation$.runTasks(Aggregation.scala:59)
    at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:31)
    at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:30)
    at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:62)
    at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:62)
    at sbt.Command$.process(Command.scala:90)
    at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(MainLoop.scala:71)
    at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(MainLoop.scala:71)
    at sbt.State$$anon$2.process(State.scala:170)
    at sbt.MainLoop$$anonfun$next$1.apply(MainLoop.scala:71)
    at sbt.MainLoop$$anonfun$next$1.apply(MainLoop.scala:71)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.MainLoop$.next(MainLoop.scala:71)
    at sbt.MainLoop$.run(MainLoop.scala:64)
    at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:53)
    at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:50)
    at sbt.Using.apply(Using.scala:25)
    at sbt.MainLoop$.runWithNewLog(MainLoop.scala:50)
    at sbt.MainLoop$.runAndClearLast(MainLoop.scala:33)
    at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:17)
    at sbt.MainLoop$.runLogged(MainLoop.scala:13)
    at sbt.xMain.run(Main.scala:26)
    at xsbt.boot.Launch$.run(Launch.scala:55)
    at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
    at xsbt.boot.Launch$.launch(Launch.scala:69)
    at xsbt.boot.Launch$.apply(Launch.scala:16)
    at xsbt.boot.Boot$.runImpl(Boot.scala:31)
    at xsbt.boot.Boot$.main(Boot.scala:20)
    at xsbt.boot.Boot.main(Boot.scala)
Caused by: java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at sbt.Project$$anon$5.apply(Project.scala:130)
    at sbt.Project$$anon$5.apply(Project.scala:128)
    at sbt.LogManager$.commandBase$1(LogManager.scala:59)
    at sbt.LogManager$.command$1(LogManager.scala:60)
    at sbt.LogManager$$anonfun$suppressedMessage$1.apply(LogManager.scala:61)
    at sbt.LogManager$$anonfun$suppressedMessage$1.apply(LogManager.scala:61)
    at sbt.ConsoleLogger.trace(ConsoleLogger.scala:163)
    at sbt.AbstractLogger.log(Logger.scala:32)
    at sbt.MultiLogger$$anonfun$dispatch$1.apply(MultiLogger.scala:40)
    at sbt.MultiLogger$$anonfun$dispatch$1.apply(MultiLogger.scala:38)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at sbt.MultiLogger.dispatch(MultiLogger.scala:38)
    at sbt.MultiLogger.trace(MultiLogger.scala:30)
    at sbt.TestLogger$$anon$2.trace(TestReportListener.scala:71)
    at sbt.TestLogger.endGroup(TestReportListener.scala:88)
    at sbt.TestRunner$$anonfun$run$5.apply(TestFramework.scala:87)
    at sbt.TestRunner$$anonfun$run$5.apply(TestFramework.scala:87)
    at sbt.TestFramework$$anonfun$safeForeach$1.apply(TestFramework.scala:112)
    at sbt.TestFramework$$anonfun$safeForeach$1.apply(TestFramework.scala:112)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
[error] Use 'last' for the full log.

Sometimes it also exits abruptly with:

sbt appears to be exiting abnormally.
  The log file for this session is at /var/folders/vf/3khb58091wd0_1rz1yh6knb00000gp/T/sbt3242766352271599341.log
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

Any solutions?

Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420
missingfaktor
  • 90,905
  • 62
  • 285
  • 365

1 Answers1

52

This sometimes happens if you compile huge codebases - a lot of classes get loaded into the VM running sbt.

You need to increase the PermGen space for sbt - use the flag -XX:MaxPermSize=256m, where 256 you can change with the desired size of the permanent generation.

Run:

cat `which sbt`

to locate you sbt startup script. Then edit it to include the flag with the java command that runs the sbt launcher in the similar way as it is described here for modifying -Xmx and -Xms.

Adding the -XX:+CMSClassUnloadingEnabled flag should also enable sbt to unload the classloaders with classes from the previous compilation runs that are no longer being used.

EDIT:

Alternatively, you can set these options in the SBT_OPTS environment variable if you are using the extended script for running sbt.

axel22
  • 32,045
  • 9
  • 125
  • 137
  • Can you also set this using the `SBT_OPTS` environment variable? – HeatfanJohn Jan 06 '14 at 21:42
  • I believe this depends on the SBT runner script you are using - if you use this extension script for running SBT, it should pick up the SBT_OPTS variable settings and allow doing much more: https://github.com/paulp/sbt-extras/blob/master/sbt – axel22 Jan 07 '14 at 11:13
  • This doesn't seem to work for some people, they have to use SBT_OPTS. Please could you edit your answer to mention this, it caused my colleague a lot of pain. (then I will upvote :) – samthebest Mar 21 '14 at 19:27
  • 3
    thank you - this helped. Typesafe activator was not working since the OSX brew install set a default max memory in sbt too small. edited the linked script in the Cellar with the SBT_OPTS in the "described here" link above. works well now – ski_squaw Apr 07 '14 at 21:41
  • in manjaro linux the sbt script is in /usr/bin/sbt & I configed the line like so: java $SBT_OPTS -XX:MaxPermSize=1200m -jar /usr/share/java/sbt/sbt-launch.jar "$@" – punkdata Aug 28 '15 at 23:44