sbtは場合によってはメモリ不足になり、クラッシュしたり、パフォーマンスが著しく低下したりすることがあります。sbtに必要なメモリ量は、ビルド内のサブプロジェクトの数と有効になっているプラグインによって異なります。メモリフットプリントの大きいプロジェクトでは、より大きなJavaヒープサイズでsbtを起動する必要がある場合があります。デフォルトのJavaヒープサイズは1GBです。これを2GBに増やすには、次のコマンドを実行します。
sbt -J-Xmx2G
先頭に-J
が付いたコマンド引数は、すべてJava VM引数として解釈されます。プロジェクトでヒープを2GBに自動的に増やすには、.sbtopts
ファイルを作成するか編集し、-J-Xmx2G
を含む行を追加します。
sbtを対話モードまたはサーバーとして実行する場合(つまり、sbt --client
またはsbtn
で起動された場合)、ビルド内の各タスクがすべてのリソースをクリーンアップすることが重要です。そうでないと、sbtのメモリフットプリントが時間の経過とともに増加する可能性があります。たとえば、runタスクがAkka ActorSystemを起動する場合、runが終了する前にActorSystemをシャットダウンする必要があります。そうでないと、sbtプロセスのメモリ使用量がrunが呼び出されるたびに増加します。
メモリリークを修正するには、予期以上にメモリに保持されているクラスを特定する必要があります。これを行う最も簡単な方法は、jdkによって提供されるjmapコマンドと、VisualVMなどのjvmメモリアナライザーツールを使用することです。デバッグするsbtプロセスのプロセスIDをps
コマンドを使用して検索します。次に、jmap -dump:format=b,file=leak.hprof $SBT_PID
を実行します。leak.hprof
ファイルをVisualVMで開きます。どのクラスが最も多くのメモリを消費しているかは明らかかもしれませんが、場合によっては「保持サイズの計算」ボタンをクリックする必要があります。ヒープが大きい場合は時間がかかる場合がありますが、どのクラスが最も多くのメモリを消費しているかを特定できます。多くの場合、これにより、リークしているスレッドやクリアされていないキャッシュを見つけることができます。