7.2.2 明示管理ヒープ機能の利用によるFullGCの抑止の仕組み
明示管理ヒープ機能では,Javaオブジェクトの配置先として,Explicitヒープという独自の領域を使用します。Explicitヒープは,Javaヒープ外にある,GCの対象にならない領域です。明示管理ヒープ機能を使用していない場合にJavaヒープに配置していたJavaオブジェクトをExplicitヒープに配置することで,FullGCが発生することを抑止できます。
ここでは,明示管理ヒープ機能を利用してFullGCを抑止する仕組みについて説明します。また,明示管理ヒープ機能の位置づけについてもあわせて説明します。
(1) FullGC発生を抑止する仕組み
Javaアプリケーション実行中にEden領域に空き領域がなくなると,GCが発生します。このとき,次の式が成り立つ場合は,JavaVMによってFullGCが実行されます。
New領域で使用されているメモリのサイズ>Tenured領域の空き領域のサイズ
- 注
-
Eden領域に空き領域がなくなっているため,New領域で使用されているメモリのサイズはNew領域の最大サイズにほぼ等しくなります。
式が示すとおり,Tenured領域の空き領域のサイズが小さくなるとFullGCが発生します。Tenured領域の空き領域は,CopyGCが発生したときにSurvivor領域から移動(昇格)するJavaオブジェクトによって使用されます。つまり,昇格するJavaオブジェクトを削減できれば,FullGCの発生を抑えられます。なお,何回かのCopyGCの実行で削除されないで,昇格の対象になるオブジェクトを長寿命オブジェクトといいます。
長寿命オブジェクトには大きく分けて2種類あります。一つは,FullGCで回収されないオブジェクトです。例えばアプリケーションの実行中は常に生存し続けるような,本来Tenured領域に格納される必要があるオブジェクトが当てはまります。このようなオブジェクトは増加し続けることはないため,FullGCが発生する本質的な原因ではありません。このような長寿命オブジェクトの影響を排除したい場合は,Tenured領域のサイズを増加することで対処できます。
二つ目は,FullGCで回収されるオブジェクトです。FullGCで回収される長寿命オブジェクトとは,Tenured領域に昇格する程度に長寿命であるが,一定期間で不要となるオブジェクトを指します。このような長寿命オブジェクトはFullGCの発生までは増加し続けるため,FullGC発生の原因となります。
FullGCで回収されるオブジェクト,およびFullGCで回収されないオブジェクトについて,次の図で説明します。
一定期間で不要となるオブジェクトの増加を防ぐ対策として,Tenured領域のサイズを増加しただけでは,効果がありません。Tenured領域のサイズを2倍にしても,FullGCの発生間隔が2倍になるだけで,期待するほどの効果は得られません。
つまり,FullGCの発生を抑止するためには,一定期間で不要となるオブジェクトのTenured領域への昇格を減らすことがポイントとなります。
アプリケーションサーバでは,一部のJavaオブジェクトについて,CopyGC発生時の昇格先がExplicitヒープになるように設定されています。明示管理ヒープ機能を使用していない場合の昇格と明示管理ヒープ機能を使用している場合の昇格の違いを次の図に示します。
図の1.のタイミングでは,どちらの場合も同じ状態です。2.のオブジェクトが昇格するタイミングで,明示管理ヒープ機能を使用していない場合の昇格では,すべての長寿命オブジェクトがTenured領域に移動します。一方,明示管理ヒープ機能を使用している場合,長寿命オブジェクトのうち,一定期間後に破棄されることがわかっているオブジェクトについてはExplicitヒープに移動します。これによって,Tenured領域に移動するのは,破棄される予定がない長寿命オブジェクトに限定され,Tenured領域の使用済みサイズの増加が緩やかになります。なお,3.で示すとおり,明示管理ヒープ機能を使用している場合のExplicitヒープのオブジェクトは,不要になったタイミングで削除されます。
対象となるJavaオブジェクトについては,「7.4 J2EEサーバ利用時にExplicitヒープに配置されるオブジェクト」を参照してください。また,GCのアルゴリズムについては,マニュアル「アプリケーションサーバ システム設計ガイド」の「7. JavaVMのメモリチューニング」を参照してください。
なお,ユーザが開発するアプリケーションで明示管理ヒープ機能を使用する場合は,一定期間後に破棄される長寿命オブジェクトを,直接Explicitヒープに生成します。これによって,Tenured領域のメモリサイズ増加を防ぎます。Explicitヒープに生成できるJavaオブジェクトについては,「7.5 アプリケーションで任意にExplicitヒープに配置できるオブジェクト」を参照してください。
(2) 明示管理ヒープ機能の位置づけ
明示管理ヒープ機能は,JavaVMの機能です。明示管理ヒープ機能を利用する方法には,次の2種類があります。
-
明示管理ヒープ機能の設定ファイルを使う方法
明示管理ヒープ機能の設定ファイルには,次のものがあります。これらを使用して,明示管理ヒープ機能を利用する対象オブジェクトを設定できます。
-
明示管理ヒープ機能適用除外設定/適用除外無効設定ファイル
-
自動配置設定ファイル
-
-
明示管理ヒープ機能APIを使う方法
明示管理ヒープ機能の位置づけを次の図に示します。なお,図中のJavaVMログファイル出力機能は,JavaVMログファイル出力機能のことです。
明示管理ヒープ機能の範囲である,明示管理ヒープ機能API,自動配置設定ファイル,明示管理ヒープ機能適用除外設定/適用除外無効設定ファイル,明示管理ヒープ機能を構成する各機能,Tenured領域内不要オブジェクト統計機能,およびExplicitヒープについて説明します。
- 明示管理ヒープ機能API
-
Javaプログラムから明示管理ヒープ機能を使用する場合,明示管理ヒープ機能APIを使用します。このAPIでは,Explicitヒープに関連する操作が実行できます。また,Explicitヒープの使用状況を稼働情報として収集することもできます。
- 自動配置設定ファイル
-
Javaプログラムを変更しないで明示管理ヒープ機能を使用する場合,自動配置設定ファイルを使用します。このファイルに明示管理ヒープに配置させたいオブジェクトを指定します。
- 明示管理ヒープ機能適用除外設定/適用除外無効設定ファイル
-
自動配置機能で明示管理ヒープに配置したオブジェクトから参照されているオブジェクトは,GC発生時に,参照関係に基づいて明示管理ヒープへ自動で移動します。この参照関係に基づく移動の対象となるオブジェクトを,クラス単位に明示管理ヒープ機能の適用対象から除外する場合,明示管理ヒープ機能適用除外設定ファイルと,明示管理ヒープ機能適用除外無効設定ファイルを使用します。
明示管理ヒープ機能の適用対象から除外する場合は,明示管理ヒープ機能適用除外設定ファイルを使用します。このファイルに明示管理ヒープへ移動しないオブジェクトのクラスを指定します。
また,明示管理ヒープ機能適用除外設定ファイルで同一パッケージ内のすべてのクラスを明示管理ヒープ機能の適用対象から除外している場合などに,一部のクラスを明示管理ヒープ機能の適用対象とするときは,明示管理ヒープ機能適用除外無効設定ファイルを使用します。このファイルに明示管理ヒープ機能適用除外の設定を無効にしたいクラスを指定します。
- 明示管理ヒープ機能を構成する各機能
-
明示管理ヒープ機能を構成する各機能は,JavaVMに含まれます。APIで呼び出されます。次の処理を実行できます。
-
Explicitヒープおよびヒープ内のメモリブロックの管理および制御
-
GCと連携したアロケーション処理の変更によるExplicitヒープへのオブジェクトの配置
なお,アロケーション処理はnewキーワードの延長で実行されます。
-
Explicitヒープメモリブロックへのオブジェクトの移動制御
-
JavaVMログファイルとスレッドダンプへのExplicitヒープのイベントログおよび状態の出力
-
- Tenured領域内不要オブジェクト統計機能
-
Tenured領域内でメモリ増加の原因となっている不要オブジェクトを調査します。Tenured領域内不要オブジェクト統計機能については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.8 Tenured領域内不要オブジェクト統計機能」を参照してください。
- Explicitヒープ
-
GCの対象外にするJavaオブジェクトの配置先になる領域です。明示管理ヒープ機能が管理します。Explicitヒープは,複数のメモリブロック(Explicitメモリブロック)で構成されます。
(3) 明示管理ヒープ機能を使用する場合に必要なメモリサイズ
明示管理ヒープ機能で管理するExplicitヒープは,Javaヒープ外の領域です。Explicitヒープを使用する場合,使用しない場合に比べて,メモリの使用量が増加します。
明示管理ヒープ機能を使用する場合は,必要なメモリサイズとしてExplicitヒープの最大サイズを見積もり,適切に設定する必要があります。明示管理ヒープ機能を利用する流れ,Explicitヒープに格納するオブジェクト(Tenured領域のメモリサイズ増加の要因になるオブジェクト),およびExplicitヒープのサイズの見積もりについては,マニュアル「アプリケーションサーバ システム設計ガイド」の「7.11 Explicitヒープのチューニング」を参照してください。