xsbt 0.13のビルドがOutOfMemoryErrorで失敗する
Windows 7 64bitで、xsbtの0.13ブランチをチェックアウトしてbuild-allでビルドすると、OutOfMemoryErrorでビルドが中断されるようになってしまった。
sbt-lanche.jarの起動はGetting Started Setup · harrah/xsbt Wiki · GitHubに記載されている通りに行っている。
xsbtのwikiページある通りのパラメータで起動した
-Xms512M -Xmx1536M -Xss1M -XX:MaxPermSize=384M -XX:+CMSClassUnloadingEnabled
実行結果
> build-all ≪省略≫ [warn] import xsbti.compile.{ CompileOrder, Output, SingleOutput, MultipleOutput } [warn] ^ [error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded [error] Use 'last' for the full log. >
「OutOfMemoryError: GC overhead limit exceeded」はガベージコレクションに時間がかかりすぎてエラーとなっていることを示しているよう。(参考:CS611@wiki - Java)
JVMのヒープメモリ使用状況(jconsole使用)
最後は通信エラーが表示され、監視対象プロセスが監視不能となった。
オプション「-XX:-UseGCOverheadLimit」を追加した
-Xms512M -Xmx1536M -Xss1M -XX:MaxPermSize=384M -XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit
実行結果
> build-all ≪省略≫ [info] Scala API documentation generation successful. [trace] Stack trace suppressed: run 'last xsbt/*:sxr' for the full output. [error] (xsbt/*:sxr) java.lang.reflect.InvocationTargetException [error] Total time: 778 s, completed 2012/10/02 17:25:07 > last xsbt/*:sxr [info] Generating sxr output in C:\Users\takamatu\apps\xsbt\target\browse.sxr... [debug] Plain interface to Scala compiler 2.9.2 with arguments: ≪省略≫ [debug] C:\Users\takamatu\apps\xsbt\util\relation\Relation.scala java.lang.OutOfMemoryError: Java heap space at java.io.WinNTFileSystem.canonicalize0(Native Method) at java.io.Win32FileSystem.canonicalize(Unknown Source) ≪省略≫ at scala.Option$WithFilter.foreach(Option.scala:176) at sxr.Browse$Traverse.process(Browse.scala:205) at sxr.Browse$Traverse.handleDefault$1(Browse.scala:170) at sxr.Browse$Traverse.traverse(Browse.scala:195) [error] (xsbt/*:sxr) java.lang.reflect.InvocationTargetException >
エラーが「OutOfMemoryError: Java heap space」に変わった。
JVMのヒープメモリ使用状況
最後は通信エラーが表示され、監視対象プロセスが監視不能となった。
オプション「-Xmx1536M」を「-Xmx1792M」に変更
-Xms512M -Xmx1792M -Xss1M -XX:MaxPermSize=384M -XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit
実行結果
> build-all ≪省略≫ Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= ≪省略≫
ビルドは最後まで中断されずに処理できたが、途中で警告が表示されていた。
JVMのヒープメモリ使用状況
JVMのメモリプール(Code Cache)
デフォルトの設定値は50MBのよう。
JVMのメモリプール(PS Perm Gen)
オプション「-XX:ReservedCodeCacheSize=100M」を追加
-Xms512M -Xmx1792M -Xss1M -XX:MaxPermSize=384M -XX:ReservedCodeCacheSize=100M -XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit
JVMのヒープメモリ使用状況
コンパイル時間が早くなったように見える。
JVMのメモリプール(Code Cache)
50Mをほんの少し超えているだけのよう・・・。
JVMのメモリプール(PS Perm Gen)
オプションで384M指定しているが必要無さそう。