1. メモリ問題のトラブルシューティング

メモリ問題のトラブルシューティング 

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で開きます。どのクラスが最も多くのメモリを消費しているかは明らかかもしれませんが、場合によっては「保持サイズの計算」ボタンをクリックする必要があります。ヒープが大きい場合は時間がかかる場合がありますが、どのクラスが最も多くのメモリを消費しているかを特定できます。多くの場合、これにより、リークしているスレッドやクリアされていないキャッシュを見つけることができます。