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経由でコンパイルします。
このエラーの原因は何かを知る手がかりはありますか?洞察力を事前に感謝します。
OutOfMemoryError: PermGen space
の原因は、十分な数がないためです 永続的な生成スペース :) Oracle JVMを使用している場合は、-XX:MaxPermSize=256M
(またはその他の量)を追加する必要がありますsbt
スクリプトへの引数)。他のJVMについては、それらのドキュメントをご覧ください。
HomeBrewを使用してOS Xにsbtをインストールします。SBT_OPTS
を使用して~/.sbtconfig
ファイルに配置できるexport SBT_OPTS=-XX:MaxPermSize=256M
引数をサポートしています。
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枯渇のいずれかです。もちろん、フラグ値の調整または必要な他のフラグの追加を検討してください。
詳細と代替アプローチは、この ブログ投稿 にあります。
この問題が発生し、メモリサイズを変更しようとしているサイトを10分間見てみました。
私はそれを解決したことが判明しました、
user-profile$ sbt
その後、
sbt-project-name 0.1> clean
これは私のためにそれをクリアしました。
私の場合、プログラムがコンパイルされ、SBTの再起動によって修正される例外にヒットする前に約3〜5回正常に実行されるため、SBTのメモリリークのように見えます。
実際、最も適切な解決策は-XX:MaxPermSize=
Alexey Romanovが推奨するJVMパラメーター、またはそれが役立つ場合はSBTを定期的に再起動する。
しかし、別の興味深い方法があります: Java 8 に切り替えてみてください。私の知る限り、PermGenはもう使用されておらず、おそらくこの例外の影響を受けません。
SBT作成者が将来のバージョンでこの問題に対処することを今でも期待しています。
もともと次のようなコマンドを使用します:
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
私はJenkins sbtプラグインでビルドしていますが、同じ問題がありました。これらは、SBT_OPTSをsbtファイルからJenkinsジョブ設定のJVMフラグにコピーした後に解決されました。
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"