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?
OutOfMemoryError: PermGen space. As explained in the above paragraph this OutOfMemory error in java comes when the Permanent generation of heap is filled up. To fix this OutOfMemoryError in Java, you need to increase the heap size of the Perm space by using the JVM option "-XX: MaxPermSize".
To fix it, increase the PermGen memory settings by using the following Java VM options. -XX:PermSize<size> - Set initial PermGen Size. -XX:MaxPermSize<size> - Set the maximum PermGen Size. In the next step, we will show you how to set the VM options in Tomcat, under Windows and Linux environment.
lang. OutOfMemoryError: PermGen Space is a runtime error in Java which occurs when the permanent generation (PermGen) area in memory is exhausted. The PermGen area of the Java heap is used to store metadata such as class declarations, methods and object arrays.
3. Metaspace. Simply put, Metaspace is a new memory space – starting from the Java 8 version; it has replaced the older PermGen memory space.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With