7.5.1 Explicitヒープに配置できるオブジェクトの条件
ここでは,Explicitヒープに配置できるオブジェクトの前提と,配置すると効果があるオブジェクトについて説明します。
- 〈この項の構成〉
(1) 配置できるオブジェクトの前提
Explicitヒープ(Explicitメモリブロック)に配置するオブジェクトは,次の前提を満たす必要があります。
-
Tenured領域のメモリサイズ増加の要因になる長寿命なオブジェクトであること
Explicitメモリブロックに対するオブジェクトの配置および解放には,一定のオーバーヘッドが掛かります。このため,Explicitメモリブロックへのオブジェクトの配置と解放は,できるだけ少なくなるようにしてください。
明示管理ヒープ機能を使用していない場合にCopyGCで回収の対象となっていた短寿命のオブジェクトを配置した場合,FullGC抑止の目的に一致しない上,オーバーヘッドが掛かってしまいます。Explicitメモリブロックには,CopyGCで回収の対象にならない,長寿命のオブジェクトを配置するようにしてください。
Tenured領域のメモリサイズ増加の要因になる長寿命のオブジェクトを特定する方法については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「9.8 Tenured領域内不要オブジェクト統計機能」を参照してください。
-
生存期間が既知であること(明示管理ヒープ機能APIを使用する場合だけ)
明示管理ヒープ機能APIを使用して明示管理ヒープを使用する場合,ExplicitメモリブロックはGCの対象にならないため,使用済みのオブジェクトは自動的に回収されません。
Explicitメモリブロックに配置したオブジェクトは,アプリケーションで明示的に解放する必要がありますが,生存期間がわからないオブジェクトの場合,明示的に解放できません。このため,生存期間が既知であるオブジェクトを配置するようにしてください。
(2) 配置すると効果があるオブジェクト
明示管理ヒープ機能は,長寿命オブジェクトのうち,一定期間後に破棄されてFullGCで回収されるオブジェクトが,Tenured領域に昇格することを防ぐ機能です。このため,アプリケーションの停止まで使用されるオブジェクトなど,FullGCでも回収されないオブジェクトに対しては,適用する必要がありません。
Explicitヒープに配置すると効果があるオブジェクトとは,次のようなオブジェクトです。
-
一定のライフサイクルで生成と破棄が実行される。
-
ライフサイクルの期間がCopyGCによってオブジェクトが昇格する期間よりも長いために,破棄実施後に使用済みのオブジェクトが正しく回収されない。
このようなオブジェクトをExplicitヒープに配置することで,Tenured領域に不要なオブジェクトが残存することを防ぎ,FullGCを抑止できます。