付録B.1 Explicitメモリブロックの自動解放処理への影響
明示管理ヒープ機能の効率的な利用には,Explicitメモリブロックの自動解放処理の効率が大きく影響します。明示管理ヒープ機能では,レイテンシのスパイクが発生しないようにこまめな自動解放をするために,メモリ領域(Explicitヒープ)をExplicitメモリブロック単位に分割して管理し,そのブロック単位に自動解放処理を実行します。Explicitメモリブロックの自動解放処理は,GCのタイミングで必要に応じて実行されます。また,自動解放処理中は,フルガーベージコレクションと同様にアプリケーションの実行が停止します。このため,自動解放処理の時間が短いほどスループットやレイテンシが向上します。
Explicitメモリブロックの自動解放処理を次の図に示します。
自動解放処理では,自動解放処理対象のExplicitメモリブロックに使用中のオブジェクトがあると,新規にExplicitメモリブロックを作成して移動します。使用中のオブジェクトが大量にあると,その量に比例して自動解放処理の時間は増加します。また,新規に作成されたExplicitメモリブロック(この例では6と7)の自動解放処理も再度実行する必要があるため,全体的な自動解放処理の時間も増加します。このため,自動解放処理時に使用中のオブジェクトがExplicitメモリブロックに少ないほど,自動解放処理の効率は向上します。このことからも,明示管理ヒープ機能では,オブジェクトの寿命が効率に影響することがわかります。
なお,自動解放処理対象のExplicitメモリブロックは,次の方法で選択されます。
- 自動解放処理対象のExplicitメモリブロックの選択方法について
-
JavaVMは,次のどれかに該当するExplicitメモリブロックを自動解放処理対象として選択(解放予約)します。
-
前回から今回までの自動解放処理の間で破棄されたHTTPセッションに対応するブロック
-
自動解放処理で新規作成されたブロック
-
自動配置機能で作成されたブロック
ただし,2.および3.のブロックは,Explicitヒープの増分と解放率予測,またはしきい値によって選択されたブロックだけが,自動解放処理対象となります。
Explicitヒープの増分と解放率予測,またはしきい値による選択方法について説明します。
- Explicitヒープの増分と解放率予測による選択
-
次の情報を基に複数のブロックを選択します。通常はこの方法を使用します。
-
前回の自動解放処理以降のExplicitヒープサイズの増分
-
過去の自動解放処理の解放率(自動解放できたオブジェクトの割合)
-
各ブロック内のオブジェクトの使用率の予測値
まず,「前回の自動解放処理以降のExplicitヒープサイズの増分」から,自動解放する予定のExplicitヒープサイズの目標値(以降,目標自動解放サイズといいます)を設定します。Explicitヒープが単調増加しないためには,Explicitヒープサイズの増分以上自動解放する必要があり,増分が大きいほど目標自動解放サイズは大きくなります。目標自動解放サイズを自動解放するためには,複数のブロックの合計でどの程度のサイズを選択すればよいか(以降,選択サイズといいます)を計算します。あるブロックを自動解放処理しても,そのブロック内のすべてのオブジェクトが解放できるとは限りません。そこで,「過去の自動解放処理の解放率」を基に,自動解放する予定のオブジェクトの解放率を予測します。予測した解放率で目標自動解放サイズを達成するために必要となる選択サイズを計算します。「過去の自動解放処理の解放率」が低いほど,選択サイズは大きくなります。
次に,「各ブロック内のオブジェクトの使用率の予測値」ですべてのブロックをソートし,使用中のオブジェクトの割合が低いと予測するブロックから順に選択します。選択したブロックの合計サイズが選択サイズに達すると選択を打ち切ります。ここで選択されたブロックが自動解放処理対象になります。
-
- しきい値による選択
-
「Explicitヒープの増分と解放率予測による選択」では,使用中のオブジェクトの割合が常に高いブロックや,選択サイズを超えるサイズのブロックは選択されません。このため,ExplicitメモリブロックのサイズがExplicitヒープ全体サイズの一定の割合(しきい値)を超えた場合,強制的に自動解放処理対象として選択します。なお,「しきい値による選択」で選択したブロックは,「Explicitヒープの増分と解放率予測による選択」では選択されません。
-