7.3.2 チューニング手順
FullGCの発生を抑止するためのJavaヒープ,およびExplicitヒープのチューニング手順について説明します。
なお,手順(1)は必ず実施します。手順(2)〜(4)は明示管理ヒープ機能を利用してExplicitヒープを使う場合に,手順(1)のあとに続けて実施します。手順(5)以降については,それぞれの手順の説明を確認の上,必要に応じて実施してください。
Javaヒープ,およびExplicitヒープのチューニング手順を次の図に示します。
- 〈この項の構成〉
(1) Javaヒープのチューニング
JavaヒープのチューニングによってFullGCを抑止する方法を検討します。Javaヒープのチューニングについては,「7.4 Javaヒープのチューニング」を参照してください。
なお,Explicitヒープ領域を利用しない場合は,Javaヒープのチューニングをした段階でJ2EEサーバのテストを実施してください。Javaヒープのメモリを適切に見積もってもFullGCが頻発する場合は,Survivor領域があふれているなど,チューニングに問題がないか確認してください。再度Javaヒープのチューニングを見直しても問題が発生する場合は,明示管理ヒープ機能を使用したExplicitヒープの利用を検討してください。Explicitヒープを利用する場合は,手順(2)に進んでください。
(2) Explicitヒープのチューニング
明示管理ヒープ機能を使用してExplicitヒープ領域を利用する場合に,Explicitヒープ領域のメモリを見積もります。Explicitヒープのチューニングについては,「7.11 Explicitヒープのチューニング」を参照してください。
JDK11以前で動作するJ2EEサーバの場合,明示管理ヒープ機能はデフォルトで使用する設定になっています。また,HTTPセッションに関するオブジェクトといったTenured領域のメモリサイズ増加の要因となるオブジェクトが,Explicitヒープに配置されるように設定されています。このため,J2EEサーバが配置するオブジェクトに必要なExplicitヒープのメモリサイズを必ず見積もってください。明示管理ヒープ機能は,Explicitヒープのメモリサイズを適切に見積もった上で使用しないと,効果が出ません。
(3) 稼働情報による見積もり結果の確認
明示管理ヒープ機能を使用する場合に,手順(1)および手順(2)でJavaVMのメモリを適切に見積もったあと,J2EEサーバのテストを実施します。テストで得た稼働情報を収集してExplicitヒープの使用状況を確認します。稼働情報を基にしたExplicitヒープの見積もりについては「7.11.4 稼働情報による見積もり」を参照してください。
- 参考
-
J2EEサーバのテストを実施し,FullGCの発生回数が削減できない場合は,次の内容を確認してください。
-
Survivor領域があふれているなど,Javaヒープのチューニングに問題がないか
手順(1)で見積もった値が適切かを見直します。
-
Explicitヒープがあふれていないか
手順(2)で見積もった値が適切かを見直します。
-
Webアプリケーションの構成が適切か
Webアプリケーションの構成(アプリケーション内のAPIの使用方法など)によっては,HTTPセッションに関するオブジェクトに対して,明示管理ヒープ機能の効果が出ない場合があります。詳細は,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.14 明示管理ヒープ機能使用時の注意事項」を参照してください。
JavaヒープおよびExplicitヒープのメモリサイズを見積もりし直しても,明示管理ヒープ機能の効果が出ないような場合に,自動解放処理が長時間化しているようなときは,「付録A HTTPセッションで利用するExplicitヒープの効率的な利用」を参考にして,アプリケーションの設計を見直してください。Explicitヒープの効率的な利用として,HTTPセッションに関するオブジェクトに対して明示管理ヒープ機能を効率良く適用するためには,アプリケーションの設計でどのような点を考慮すればよいかや,そのためのログの確認方法について説明しています。
これらを確認しても問題が解決しない場合に,手順(4)に進んでください。
-
(4) Tenured領域のメモリサイズが増加するかどうかの確認
アプリケーションを開始して,Tenured領域のメモリサイズを調査します。調査には,手順(3)で取得した稼働情報,または拡張verbosegc情報で取得した情報を使用します。拡張verbosegc情報の取得については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「5.7.2 拡張verbosegc情報の取得」を参照してください。
(5) Tenured領域のメモリサイズ増加の要因となるオブジェクトのExplicitヒープへの配置
手順(3)と(4)で,FullGCの頻発とTenured領域のメモリサイズ増加が確認され,FullGCの抑止が必要となった場合は,Tenured領域のメモリサイズ増加の要因となっているオブジェクトをExplicitヒープに配置することを検討してください。ここで検討対象とするオブジェクトは,「J2EEサーバがデフォルトでExplicitヒープに配置するオブジェクト」ではなく,それ以外の「Javaアプリケーション上で作成しているオブジェクト」です。このオブジェクトをJavaヒープではなくExplicitヒープに配置することで,FullGCの発生回数の削減が期待できます。Tenured領域のメモリサイズ増加の要因となるオブジェクトを特定する方法については,「7.13.2 Tenured領域利用済みサイズの増加原因が不明な場合」を参照してください。
Tenured領域のメモリサイズ増加の要因となるオブジェクトをExplicitヒープに配置する方法には,次の2種類があります。
-
明示管理ヒープ機能APIの利用
-
明示管理ヒープ機能の自動配置機能の利用
明示管理ヒープ機能APIの利用方法については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.12 明示管理ヒープ機能APIを使ったJavaプログラムの実装」を,明示管理ヒープ機能の自動配置機能の利用方法については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.13.2 自動配置設定ファイルを使った明示管理ヒープ機能の使用」を参照してください。
これらの機能を利用してExplicitヒープに新たなオブジェクトを配置すると,Explicitヒープのメモリサイズが増加します。このため,再度,Explicitヒープのメモリサイズの見直しが必要になります。手順(6)に進んでください。
(6) Explicitヒープ全体のメモリサイズの見直し
手順(5)で修正したアプリケーションを動作させて,J2EEサーバとアプリケーションが使用するExplicitヒープ全体のメモリサイズを見直します。見直し方法については,「7.12 アプリケーションで明示管理ヒープ機能を使用する場合のメモリサイズの見積もり」を参照してください。
- ポイント
-
明示管理ヒープ機能によってFullGCの発生抑止の効果を得るためには,Explicitヒープからオブジェクトがあふれないようにする必要があります。次の点を確認してください。
-
Webアプリケーション内でセッションの破棄(invalidateメソッド呼び出し)および適切なセッションタイムアウトを設定していること。
-
適切なメモリサイズのExplicitヒープ領域をJavaヒープ領域とは別に確保できること。
Explicitヒープあふれが発生した場合の確認と対処については,「7.14.3 Explicitヒープあふれが発生した場合の確認と対処」を参照してください。
以降では,Javaヒープのチューニング,およびExplicitヒープのチューニングについて説明します。なお,これ以外の注意事項については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7. 明示管理ヒープ機能を使用したFullGCの抑止」を参照してください。
-