如何防止 java.lang.OutOfMemoryError: PermGen space? [英] How to prevent java.lang.OutOfMemoryError: PermGen space?

查看:37
本文介绍了如何防止 java.lang.OutOfMemoryError: PermGen space?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我经常收到来自 SBT 的 OutOfMemoryError.

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.

有时它也会突然退出:

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

有什么解决办法吗?

推荐答案

如果您编译庞大的代码库,有时会发生这种情况 - 许多类被加载到运行 sbt 的 VM 中.

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

您需要为 sbt 增加 PermGen 空间 - 使用标志 -XX:MaxPermSize=256m,其中 256 可以更改为永久代所需的大小.

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.

运行:

cat `which sbt`

找到你的 sbt 启动脚本.然后编辑它以包含带有 java 命令的标志,该命令以与 此处描述 用于修改-Xmx-Xms.

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.

添加 -XX:+CMSClassUnloadingEnabled 标志还应该使 sbt 能够卸载带有不再使用的先前编译运行的类的类加载器.

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.

或者,如果您使用的是 用于运行 sbt 的扩展脚本.

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

这篇关于如何防止 java.lang.OutOfMemoryError: PermGen space?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆