IBM i - プール・サイズ
Javaはオブジェクト指向言語のため、記憶域にオブジェクトを作成します。通常は、多くのオブジェクトを作成します。
さらに、Javaでは自動ガベージ・コレクション(GC)が提供されるため、実行中のJavaコードからオブジェクトにアクセスできなくなってからしばらく時間が経過すると、ガベージ・コレクターによってオブジェクトが削除されます。
IBM i サーバーでは、(仮想に対して)実際のメモリー量をメモリー・プールで指定できます。
GCヒープの実際のサイズと、プールを共有する場合に他のプログラムがそのプールから使用するメモリーの実際のサイズが、プールで指定された実際のメモリー量を超えると必ずページ・フォルトが発生します。
JVMのメモリー・プールが小さすぎると、過度のページ・フォルトが発生する場合があります。
これらのフォルトは、WRKSYSSTSコマンド表示で非データベース・ページ・フォルトとして報告されます。
通常、JVMの記憶域プールは*BASEです。
一般的に、20〜30/秒のフォルト率は許容されますが、それよりも高くなった場合、メモリー・プール・サイズを増やしてフォルト率を下げる必要があります。
場合によっては、この値を20〜30/秒より小さくすることでもパフォーマンスを改善できます。
また、GCHINLパラメータを低くする場合、i5/OS JVMヒープ・サイズを小さくすることでページング率は下がりますが、GCサイクルの頻度が上がるため、パフォーマンスの問題も発生する可能性があります。
メモリー・プールには関連するアクティビティ・レベルもあります。このレベルでは、メモリー・プールから同時にプロセッサをアクティブに使用できるスレッド数を指定します。
アクティビティ・レベル制御を行った状態で同時実行が可能な数よりも多くのスレッドを開始した場合、過度のスレッドはアクティビティ・レベル・スロットが利用可能になるまで待ってから実行されます。
実行中のスレッド(アクティブなスレッド)の数は、プロセッサを目指して競い合う資格があり、メモリー・プールのアクティビティ・レベルに対して有効なスレッドの数になります。
アクティブなスレッドには、入力、メッセージ、デバイスの割り当てを待機しているスレッドやファイルが開くのを待機しているスレッドは含まれません。
アクティブなスレッドには、資格のないスレッド(実行する準備はできているが、メモリー・プールのアクティビティ・レベルが最大になっているスレッド)は含まれません。
メモリー・プールの最大アクティビティ・レベルに達すると、メモリー・プールを必要とする追加スレッドは不適格な状態に置かれます。
このスレッドは、メモリー・プール内のアクティブなスレッドの数が最大アクティビティ・レベルを下回るまで、あるいは1つのスレッドがそのタイム・スライスの最後に達するまで不適格な状態で待機します。
1つのスレッドがメモリー・プールの使用をあきらめるとすぐに、アクティブではない他のスレッドが適格なスレッドになり、その優先順位に基づいて送られます。
Javaスレッドが不適格な状態にある場合、深刻なパフォーマンスの低下が発生し、JVM GCヒープが過剰に増加します。
Javaスレッドが不適格な状態にある場合、そのスレッドはガベージ・コレクターと通信できないため、Java GCサイクルは完了できません。
このため、GCヒープは急速に増加し、プールがページ・スラッシングに陥りやすくなり、パフォーマンスがさらに低下します。
この状態を避けるには、少なくともメモリー・プールのアクティビティ・レベルを、メモリー・プールで実行するJVMに対していつでも同時にアクティブになると思われる最大スレッド数程度に設定します。