Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent java.lang.OutOfMemoryError: PermGen space? [duplicate]

Tags:

scala

sbt

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?

like image 392
missingfaktor Avatar asked Apr 11 '13 19:04

missingfaktor


People also ask

How do I fix Java Lang OutOfMemoryError PermGen space?

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".

How can you control size of PermGen space?

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.

What causes PermGen space error?

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.

What is the replacement of PermGen space in Java 8?

3. Metaspace. Simply put, Metaspace is a new memory space – starting from the Java 8 version; it has replaced the older PermGen memory space.


1 Answers

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.

like image 115
axel22 Avatar answered Oct 08 '22 18:10

axel22