◾️はじめに
Javaの「Stop-the-World(STW)」が起きていそうなので 調査方法をメモしてみた
目次
【1】Step1:GCログを有効にする 1)GCログの有効化 【2】GCログを分析する 【3】Stop-the-Worldの原因を特定する 【4】解決案:GC種類を変更する 1)コンカレントGCの有効化
【1】Step1:GCログを有効にする
1)GCログの有効化
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
詳細なログ
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
色々なオプション
-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=5
# | オプション | 説明 |
---|---|---|
1 | -verbose:gc | GCログの有効化(Xloggcオプションで指定しない場合は、stdoutに出力) |
2 | -Xloggc:【GCログファイルパス】 | 出力したGCログを指定したファイルへ出力する |
3 | -XX:+PrintGCDetails | GCログの詳細表示 |
4 | -XX:+PrintGCDateStamps | 日付/時間を追加 |
5 | -XX:+UseGCLogFileRotation | GCログのローテーション |
6 | -XX:GCLogFileSize=【GCログファイルサイズ】 | ローテーションファイルの閾値 |
7 | -XX:NumberOfGCLogFiles=【GCログファイル世代数】 | ローテーションファイルの世代数 |
【2】GCログを分析する
* GCログに記録される情報を解析して、Stop-the-Worldイベントの発生を確認 * 特に「Pause」や「Stop-the-World」といったイベントに関連するログをチェック
例
[GC (Pause) 2025-03-10T10:10:01.123+0000: 1234.567: [GC (Initial Mark) [PSYoungGen: 4096K->512K(8192K)] 5120K->1024K(12288K), 0.0123456 secs] # 「PSYoungGen」や「Initial Mark」: ガーベジコレクション種類
【3】Stop-the-Worldの原因を特定する
GCの種類
* Young GCやFull GCなど、どのGCイベントが発生しているかを確認
ヒープサイズ
* ヒープが足りていない場合やメモリが断片化している場合、Full GCが頻繁に発生する
アプリケーションの負荷
* メモリの使用状況やリクエスト数が急増している場合にもSTWが発生しやすくなる
【4】解決案:GC種類を変更する
1)コンカレントGCの有効化
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
# | オプション | 説明 |
---|---|---|
1 | -XX:+UseConcMarkSweepGC | コンカレントGCの有効化 |
2 | -XX:+CMSIncrementalMode | インクリメンタル・モードの有効化(Java SE 8で非推奨) |
関連記事
Java 〜 ガベージコレクション 〜
https://dk521123.hatenablog.com/entry/2018/01/01/200400
Java 〜 メモリ構造 〜
https://dk521123.hatenablog.com/entry/2014/06/14/235331
JVMのメモリ情報を出力させる
https://dk521123.hatenablog.com/entry/2014/04/08/211143
メモリ分析ツール ~ JFR / JMC ~
https://dk521123.hatenablog.com/entry/2014/03/17/234107
メモリ分析ツール ~ Memory Analyzer ~
https://dk521123.hatenablog.com/entry/2014/02/24/235516
メモリ分析ツール ~ jattach ~
https://dk521123.hatenablog.com/entry/2025/03/12/002316