【问题标题】:Intellij OutOfMemoryError: PermGenSpace with ScalaIntellij OutOfMemoryError:使用 Scala 的 PermGenSpace
【发布时间】:2018-07-03 08:52:44
【问题描述】:

是的,在您将其标记为重复之前,我已经阅读过

How to prevent java.lang.OutOfMemoryError: PermGen space?

How to prevent java.lang.OutOfMemoryError: PermGen space at Scala compilation?

但它没有为我提供任何解决方案。

问题来了

我在使用 junit 编写的应用程序中确实有一个简单的测试,例如:

public class FooTest extends BaseTest {

    @Test
    public void testSomeMethod() {
    ...
    //Some Asserts
    ...
    }
}

我正在尝试通过简单地单击“运行”来使用 Intellij 运行此测试:

然后创建以下配置:

运行测试打印然后如下:

[IJ][pos] $ all {file:/C:/somepath/test/}pos/foopackage {file:/C:/somepath/test/}pos/test:foopackage
[info] Compiling 1 Scala source and 6 Java sources to C:\somepath\test\target\scala-2.11\classes...
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
        at java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.util.concurrent.FutureTask.get(FutureTask.java:188)
        at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:188)
        at sbt.Execute.next$1(Execute.scala:83)
        at sbt.Execute.processAll(Execute.scala:86)
        at sbt.Execute.runKeep(Execute.scala:66)
        at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:359)
        at sbt.EvaluateTask$.run$1(EvaluateTask.scala:358)
        at sbt.EvaluateTask$.runTask(EvaluateTask.scala:378)
        at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:64)
        at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:62)
        at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:314)
        at sbt.Aggregation$.timedRun(Aggregation.scala:62)
        at sbt.Aggregation$.runTasks(Aggregation.scala:71)
        at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:32)
        at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:31)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
        at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:153)
        at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:152)
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:244)
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:241)
        at sbt.Command$.process(Command.scala:93)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.State$$anon$1.process(State.scala:184)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.MainLoop$.next(MainLoop.scala:98)
        at sbt.MainLoop$.run(MainLoop.scala:91)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:70)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:65)
        at sbt.Using.apply(Using.scala:24)
        at sbt.MainLoop$.runWithNewLog(MainLoop.scala:65)
        at sbt.MainLoop$.runAndClearLast(MainLoop.scala:48)
        at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:32)
        at sbt.MainLoop$.runLogged(MainLoop.scala:24)
        at sbt.StandardMain$.runManaged(Main.scala:53)
        at sbt.xMain.run(Main.scala:28)
        at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
        at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
        at xsbt.boot.Launch$.run(Launch.scala:109)
        at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
        at xsbt.boot.Launch$.launch(Launch.scala:117)
        at xsbt.boot.Launch$.apply(Launch.scala:18)
        at xsbt.boot.Boot$.runImpl(Boot.scala:41)
        at xsbt.boot.Boot$.main(Boot.scala:17)
        at xsbt.boot.Boot.main(Boot.scala)
Caused by: java.lang.OutOfMemoryError: PermGen space
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
[error] Use 'last' for the full log.
[IJ][pos] $
[IJ][pos] $

这是我目前尝试过的:

正如我提到的问题已经发布,我试图通过在我的系统上配置已安装的 sbt 来摆脱这个错误:

我安装的sbt版本目前是0.13.15

所以我配置了:

C:\installpath\Scala\sbt_0_13_15\conf\sbtconfig.txt

如下:

-Xmx2G
-Xms2G
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=256m
-Dsbt.log.format=false
-XX:+CMSClassUnloadingEnabled

但我仍然遇到同样的错误。所以我检查了 Intellij 从哪里获取 sbt,以及使用控制台的 sbt test 构建是否也会失败。

sbt 测试

似乎运行成功:

[info] Done updating.
[info] Compiling 450 Scala sources and 1132 Java sources to C:\somepath\test\target\scala-2.11\classes
[info] Weaving 1 input to C:\somepath\test\target\scala-2.11\aspectj\classes...
[info] Compiling 103 Java sources to C:\somepath\test\target\scala-2.11\test-classes...
[info] Instrumenting 6228 classes to C:\somepath\test\target\scala-2.11\jacoco\instrumented-classes
...
[info] 2 tests, 0 failures, 0 errors
... And goes on and on

所以我确实检查了它在 Intellij 中的配置方式:

我还在那里输入了 VM 参数:

-Xmx2G -Xms2G -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=256m -Dsbt.log.format=false -XX:+CMSClassUnloadingEnabled

但我还是遇到了同样的错误。

然后我尝试将.sbtopts 文件添加到根文件夹中。

文件内容为:

-J-Xmx2G
-J-Xms2G
-J-XX:MaxPermSize=1G
-J-XX+CMSClassUnloadingEnabled

删除后

-J-XX+CMSClassUnloadingEnabled

从项目文件夹中的.sbtopts- 文件可以构建项目。

似乎出现了这个异常:

C:\Java7\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=localhost:53488,suspend=n,server=y -Xdebug -server -Xmx2G -Xms2G -XX:MaxPermSize=1G -XX+CMSClassUnloadingEnabled -Xmx2048M -Dfile.encoding=UTF-8 -Didea.runid=2017.2 -Didea.managed=true -jar C:\installpath\Scala\sbt_0_13_15\bin\sbt-launch.jar idea-shell
Unrecognized option: -XX+CMSClassUnloadingEnabled
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

【问题讨论】:

  • 可能值得更新到 Java 8,因为不再支持 Java 7。注意:Java 8 没有 perm gen,很可能不会有这个问题。

标签: java scala sbt


【解决方案1】:

删除后

-J-XX+CMSClassUnloadingEnabled

从项目文件夹中的.sbtopts- 文件可以构建项目。

似乎出现了这个异常:

C:\Java7\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=localhost:53488,suspend=n,server=y -Xdebug -server -Xmx2G -Xms2G -XX:MaxPermSize=1G -XX+CMSClassUnloadingEnabled -Xmx2048M -Dfile.encoding=UTF-8 -Didea.runid=2017.2 -Didea.managed=true -jar C:\installpath\Scala\sbt_0_13_15\bin\sbt-launch.jar idea-shell
Unrecognized option: -XX+CMSClassUnloadingEnabled
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

【讨论】:

  • 标志必须这样拼写:-J-XX:+CMSClassUnloadingEnabled -- 注意XX后面的冒号。
猜你喜欢
  • 2012-06-05
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多