【Java】Java の Stop-The-World の調査方法

◾️はじめに

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