web-dev-qa-db-ja.com

Java.lang.OutOfMemoryErrorを防ぐ方法:Scalaコンパイル時のPermGenスペース?

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

それはたまにしか発生せず、通常、後続のコンパイル実行でエラーはスローされません。 Scala 2.9.0を使用し、SBT経由でコンパイルします。

このエラーの原因は何かを知る手がかりはありますか?洞察力を事前に感謝します。

79
BumbleGee

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

46
Alexey Romanov

HomeBrewを使用してOS Xにsbtをインストールします。SBT_OPTSを使用して~/.sbtconfigファイルに配置できるexport SBT_OPTS=-XX:MaxPermSize=256M引数をサポートしています。

99
michaelliu

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

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

MaxMetaspaceSizeはJava 8であるのに対し、MaxPermSizeはJava 7。 permgenまたはmetaspace枯渇のいずれかです。もちろん、フラグ値の調整または必要な他のフラグの追加を検討してください。

詳細と代替アプローチは、この ブログ投稿 にあります。

36
Tvaroh

この問題が発生し、メモリサイズを変更しようとしているサイトを10分間見てみました。

私はそれを解決したことが判明しました、

user-profile$ sbt

その後、

sbt-project-name 0.1> clean

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

5
Alex Stewart

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

実際、最も適切な解決策は-XX:MaxPermSize= Alexey Romanovが推奨するJVMパラメーター、またはそれが役立つ場合はSBTを定期的に再起動する。

しかし、別の興味深い方法があります: Java 8 に切り替えてみてください。私の知る限り、PermGenはもう使用されておらず、おそらくこの例外の影響を受けません。

SBT作成者が将来のバージョンでこの問題に対処することを今でも期待しています。

4
Ivan

もともと次のようなコマンドを使用します:

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

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

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

Java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
2
Jonik

私はJenkins sbtプラグインでビルドしていますが、同じ問題がありました。これらは、SBT_OPTSをsbtファイルからJenkinsジョブ設定のJVMフラグにコピーした後に解決されました。

2
niebo

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 configをエクスポートする

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
0
KARTHIKEYAN.A