2013-04-11 4 views
34

Я часто получаю OutOfMemoryError от SBT.Как предотвратить java.lang.OutOfMemoryError: пространство PermGen?

> 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,[email protected]), ?) 
[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. 

Иногда он также внезапно выходит с:

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 

Любые решения?

+0

Вы не говорите, какую версию SBT вы используете, но ранние версии были очень склонны к истечению PermGen после нескольких повторений определения проекта. Текущие версии кажутся довольно неуязвимыми для этой проблемы, но вам все равно просто нужно увеличить выделение. –

+0

@ RandallSchulz, версия 0.12.2. – missingfaktor

+0

Также укажите версию Java и ОС. – SSR

ответ

51

Это случается, если вы скомпилируете огромные кодовые базы - множество классов загружается в виртуальную машину под управлением sbt.

Вам необходимо увеличить площадь PermGen для sbt - используйте флаг -XX:MaxPermSize=256m, где 256 вы можете изменить с помощью требуемого размера постоянного поколения.

Пробег:

cat `which sbt` 

, чтобы найти вас SBT запуска сценария. Затем отредактируйте его, чтобы включить флаг с командой java, которая запускает пусковую установку sbt таким же образом, как и described here для изменения -Xmx и -Xms.

Добавление флага -XX:+CMSClassUnloadingEnabled также должно позволить sbt выгружать загрузчики классов с помощью классов из предыдущих запусков компиляции, которые больше не используются.

EDIT:

В качестве альтернативы, вы можете установить эти параметры в переменной окружения SBT_OPTS, если вы используете extended script for running sbt.

+0

Можете ли вы также установить это с помощью переменной среды 'SBT_OPTS'? – HeatfanJohn

+0

Я полагаю, что это зависит от сценария бегуна SBT, который вы используете, - если вы используете этот скрипт расширения для запуска SBT, он должен выбрать параметры переменной SBT_OPTS и позволить делать гораздо больше: https://github.com/paulp/sbt- extras/blob/master/sbt – axel22

+0

Это, похоже, не работает для некоторых людей, они должны использовать SBT_OPTS. Пожалуйста, не могли бы вы отредактировать свой ответ, чтобы упомянуть об этом, это вызвало у моего коллеги много боли. (тогда я буду повышать :) – samthebest