IBM i - JavaのGCのチューニング
ガベージ・コレクターを実行しているときにその追加データを収集すると役立つ場合があります。
コレクターを実行するたびに情報をダンプするverbose GCを使用してデータを収集できます。
このデータには、現在のヒープ・サイズ、収集したオブジェクトの数とサイズ、ヒープ内のオブジェクト数、コレクターの実行時間、その他の情報があります。
verbose GC出力のサンプル:
GC 4: starting collection, threshold allocation reached.
GC 4: live objects 2562187; collected objects 4936351; collected (KB) 541840.
GC 4: queued for finalization 0; total soft references 92; cleared soft references 5.
GC 4: current heap (KB) 1171424; current threshold (KB) 524288.
GC 4: collect (milliseconds) 4138.
GC 4: current cycle allocation (KB) 236160; previous cycle allocation (KB) 524314.
GC 4: total weak references 684; cleared weak references 0.
GC 4: total final references 11797; cleared final references 63.
GC 4: total phantom references 0; cleared phantom references 0.
GC 4: total old soft references 0; cleared old soft references 0.
ガベージ・コレクターをチューニングする場合に最も重要なフィールドは以下のとおりです。
· 最後のサイクルが開始してから割り当てられたメモリー、previous cycle allocation (KB)
· 現在のサイクルが開始してから割り当てられたメモリー、current cycle allocation (KB)
· このサイクルの経過時間、collect (ミリ秒)
· しきい値、current threshold (KB)
· 現在のヒープ・サイズ、current heap (KB)
· このサイクルで収集されたオブジェクトの合計サイズ、collected (KB)
· このサイクルで収集されたオブジェクトの数、collected objects
· JVMで現在アクティブなオブジェクトの数、live objects
· JVM開始から4番目のGCサイクル、GC 4
current threshold (現在のしきい値)は、初期ヒープ・サイズ(出力例では512MB)に設定された値です。
previous cycle allocation (以前のサイクル割り当て)は、通常、この値に近づきます。最後のサイクル開始以降に割り当てられたメモリー量がしきい値に達すると、GCサイクルが開始するためです。
出力例では、GCサイクルが終了するのに4秒以上かかっています。この間、current cycle allocation (現在のサイクル割り当て)は200MBを超えています。これはしきい値の約40%になるため、このサイクルの開始から次のサイクルまでの合計時間が約10秒になると予測されます。このサイクルでは、5000000近いオブジェクトを収集しています(collected objects、収集されたオブジェクト)。サイクルの最後にヒープに残るオブジェクトはわずか2500000です(live objects、有効なオブジェクト)。
通常、サイクル時間は短くすることが最適です。1〜2秒が理想ですが、5〜10秒が一般的です。
収集サイクル間である程度の時間を設けることも大切です(current cycle allocation (現在のサイクル割り当て)を、current threshold (現在のしきい値)よりも少なくします)。
この2つの目的は相反しています。つまり、しきい値を増やすとヒープは大きくなるため、サイクル間の時間は長くなりますが、各サイクルが長くなります。しきい値を減らすと各サイクルは短くなりますが、サイクル間の時間も短くなります。
GCのチューニングで重要なのは、この2つの目的の間でバランスを取ることです。これが、現在のヒープ・サイズなどの値を確認するよりもGCで消費されるCPUを調べる方が一般的に良いとされる理由です。
パフォーマンス・ツールのライセンス・プログラム・プロダクト(PT1 LPP)がシステムにインストールされていない場合は、しきい値で実験できます。アプリケーションのスループットや応答時間、詳細GC出力を使用して、しきい値をさらに調整する方法を決めます。
PT1がある場合でも、アプリケーションでのヒープの使用状況を把握し、アプリケーションやシステムの負荷の変化に応じたGC動作の変化を観察する場合にverbose GC出力を調べると役立ちます。