ねこ元帥の中の人@リウマチ

日々の覚書など。ブログ名はオンラインゲームのアカウント名をいつも「ねこ元帥」にしているから。そして、2013年11月リウマチと診断されたとです。(2012年11月から時々手足に原因不明の痛みが発生、2013年9月以降は足の痛みが常態化、2013年12月30日からMTX服用開始、4月過ぎるころにはわずかの痛みが残る程度まで回復して現在に至る。)

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指定しているが必要無さそう。

オプション変更:「-XX:MaxPermSize=256M」「-XX:ReservedCodeCacheSize=60M」

-Xms512M -Xmx1792M -Xss1M -XX:MaxPermSize=256M -XX:ReservedCodeCacheSize=60M -XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit


JVMのヒープメモリ使用状況


JVMのメモリプール(Code Cache)


JVMのメモリプール(PS Perm Gen)