IBM i - JavaのGCのチューニング

LANSA Integrator

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出力を調べると役立ちます。