81

私のscalaコンパイラの奇妙な振る舞いに気づきました。クラスのコンパイル時にOutOfMemoryErrorがスローされることがあります。エラーメッセージは次のとおりです。

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

これはたまにしか発生せず、通常、その後のコンパイル実行ではエラーはスローされません。私はScala2.9.0を使用し、SBTを介してコンパイルします。

このエラーの原因が何であるかについて誰かが手がかりを持っていますか?洞察を事前に感謝します。

4

9 に答える 9

100

HomeBrewを使用してOSXにsbtをインストールします。これは、。を使用してファイルSBT_OPTSに入れることができる引数をサポートします。~/.sbtconfigexport SBT_OPTS=-XX:MaxPermSize=256M

于 2012-10-11T03:12:21.867 に答える
47

原因は、永続的な生成スペースOutOfMemoryError: PermGen spaceが十分にないことです:) Oracle JVMを使用している場合は、スクリプトに(または他の量のスペース)引数を追加する必要があります。他のJVMについては、それらのドキュメントを参照してください。-XX:MaxPermSize=256Msbt

于 2011-11-30T20:36:04.983 に答える
38

sbt0.13.6以降を使用していると仮定しました。次の内容でsbtプロジェクトのルートに.sbtoptsファイルを作成します。

-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled

MaxMetaspaceSizeはJava8用ですが、はJava 7用です。これらは、 permgenまたはメタスペースの枯渇MaxPermSizeに関連するメモリ不足エラーを防ぐために重要です。もちろん、フラグ値を調整するか、必要な他のフラグを追加することを検討してください。

詳細と代替アプローチについては、このブログ投稿をご覧ください。

于 2015-03-28T14:48:03.027 に答える
6

私はこの問題を抱えていて、メモリサイズを変更しようとしているサイトを見て10分間それをいじりました。

私はそれを解決したことがわかりました、

user-profile$ sbt

それで、

sbt-project-name 0.1> clean

これは私のためにそれをクリアしました。

于 2013-08-11T02:55:14.260 に答える
5

私の場合、プログラムがコンパイルされ、SBTの再起動によって修正される例外が発生する前に、約3〜5回正常に実行されるため、SBTのメモリリークのように見えます。

Alexey Romanovが提案しているように、最も適切な解決策は実際に-XX:MaxPermSize=JVMパラメータであるか、それが役立つ場合はSBTを定期的に再起動することです。

しかし、別の興味深い方法があります。Java8に切り替えてみてください。AFAIKは、PermGenを使用しなくなり、おそらくこの方法でこの例外の影響を受けなくなります。

SBTの作者が将来のバージョンでこの問題に対処することを私はまだ望んでいます。

于 2013-02-22T00:35:34.070 に答える
3

Jenkins sbtプラグインを使用してビルドしていますが、同じ問題が発生しました。これらは、SBT_OPTSをsbtファイルからJenkinsジョブ構成のJVMフラグにコピーした後に解決されました。

于 2014-07-25T18:59:30.567 に答える
3

元々は次のようなコマンドを使用していました:

java -jar /path/to/sbt-launch.jar test

最初にOutOfMemoryError:を使用して解決したPermGenスペース-XX:MaxPermSizeを取得し、次にOutOfMemoryError:Javaヒープスペースを取得しました。これ-Xmxが解決策でした。

したがって、私の場合、次のようなコマンドが機能しました。

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
于 2015-10-14T14:06:50.623 に答える
0

sbt.shファイルの次のコードブロックを変更し、正常に動作するように保存します。

get_mem_opts () {
  local mem=${1:-1536}
  local perm=$(( $mem / 4 ))
  (( $perm > 256 )) || perm=1024 //256 to 1024
  (( $perm < 1024 )) || perm=2048 // 1024 to 2048
  local codecache=$(( $perm / 2 ))

  echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}

また

ターミナルを使用してsbt構成をエクスポートする

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
于 2017-08-30T07:00:43.563 に答える
0

プロジェクトのルートフォルダにファイルを追加し、.jvmoptsファイル内に次のように書き込むこともできます。

-Xms1g
-Xmx4g
于 2021-03-25T18:29:32.383 に答える