7.15.9 Concurrent Marking(CM)
(1) 実行契機
CMは大きく次の4つの処理から構成されます。それぞれの実行契機について示します。なお,1.〜4.の表記は上図の1.〜4.に対応しています。
-
Concurrent Root Region Scan:
YoungGC(initial-mark)終了後,実行されます。
-
Concurrent Mark:
1.の終了後,1.に続けて実行されます。
-
Remark:
2.の終了後,アプリケーションを停止できるタイミングで実行されます。
-
Cleanup:
3.の終了後,アプリケーションを停止できるタイミングで実行されます。
(2) 対象範囲
New領域,Tenured領域およびHumongous領域
(3) 処理内容
CMは大きく次の4つの処理から構成されます。それぞれの処理の詳細を示します。
-
Concurrent Root Region Scan:
ローカル変数や使用中のオブジェクトから直接参照されているSurvivor領域内のオブジェクトにマークを付ける処理です。マルチスレッドで実行されます。
-
Concurrent Mark:
YoungGC(initial-mark)のマーキングと1.のマーキングでマークを付けたオブジェクトが参照しているオブジェクトにマークを付ける処理です。マルチスレッドで実行されます。
-
Remark:
2.のマーキング中に参照関係が変化したオブジェクトのマークを付け直す処理です。マルチスレッドで実行されます。
-
Cleanup:
リージョンごとに使用中のオブジェクトの合計サイズを求める処理です。また,次のCMに備え,マークの初期化もします。マルチスレッドで実行されます。
(4) 処理結果
- Eden領域:
-
使用中のオブジェクトに対応した領域にマークが付きます。
3.の処理でEdenリージョンが回収された場合,領域サイズが減少します。
- Survivor領域:
-
使用中のオブジェクトに対応した領域にマークが付きます。
3.の処理でSurvivorリージョンが回収された場合,領域サイズが減少します。
- Tenured領域:
-
使用中のオブジェクトに対応した領域にマークが付きます。
3.の処理でTenuredリージョンが回収された場合,領域サイズが減少します。
- Humongous領域:
-
使用中のオブジェクトに対応した領域にマークが付きます。
3.の処理でHumongousリージョンが回収された場合,領域サイズが減少します。
- Metaspace領域:
-
変化はありません。
- Free領域:
-
使用中のオブジェクトが1つも存在しないリージョンを回収した場合,領域サイズが増加します。
(5) アプリケーションの停止の有無
-
Concurrent Root Region Scan:
CMスレッドで,アプリケーションを停止しないで実行されます。
-
Concurrent Mark:
CMスレッドで,アプリケーションを停止しないで実行されます。
-
Remark:
VMスレッドで,アプリケーションを停止して実行されます。
-
Cleanup:
VMスレッドで,アプリケーションを停止して実行されます。
(6) ほかのGCとの関係
注 CMの処理中はYoungGC(initial-mark)は発生しません。
-
Concurrent Root Region Scan:
-
YoungGC(normal):実行されません。
-
MixedGC:実行されません。
-
FullGC:実行されません。
-
-
Concurrent Mark:
-
YoungGC(normal):2.の処理中に実行された場合,2.の処理を中断します。YoungGC(normal)が終了すると,再開されます。
-
MixedGC:実行されません。
-
FullGC:2.の処理中に実行された場合,2.の処理を中止します。途中結果は破棄されます。
-
-
Remark:
-
YoungGC(normal):実行されません。
-
MixedGC:実行されません。
-
FullGC:実行されません。
-
-
Cleanup:
-
YoungGC(normal):実行されません。
-
MixedGC:実行されません。
-
FullGC:実行されません。
-
(7) 補足
-
関連オプション
CMをするスレッド数は-XX:ConcGCThreadsオプションで指定できます。CMをするスレッド数を増やすとスループットが低下します。-XX:ConcGCThreadsオプションを指定しなかった場合,スレッド数は-XX:ConcGCThreadsオプションのデフォルト値となります。詳細については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「14.5 Application Serverで指定できるJava HotSpot VMのオプション」の-XX:ConcGCThreadsを参照してください。
-
確認方法
Concurrent Root Region Scan,Concurrent Markの確認はログの先頭に[VCM]の識別子が付いていることから確認できます。Concurrent Markのログのイメージを次に示します。
[VCM]<Wed Jul 31 11:45:23 2013>[Concurrent Mark Start][User: 0.0000000 secs][Sys: 0.0000000 secs] [VCM]<Wed Jul 31 11:45:31 2013>[Concurrent Mark End][User: 0.0321549 secs][Sys: 0.0129454 secs]
VCMのログが複数行にわたるため,CMログは開始時にStart,終了時にEndが出力されます。複数行に渡る場合,CPU使用時間はEndのログにStartからEndまでの処理時間が出力され,Startのログは0が出力されます。ログの記述内容や詳細に関しては,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「-XX:[+|-]HitachiVerboseGC(拡張verbosegc情報出力オプション)」を参照してください。
またRemark,Cleanupの処理は処理中にアプリケーションを停止するため,VG1ログに出力されます。Remark,Cleanupの処理はGCログのGC種別が“CM Remark”,“CM Cleanup”という出力から判断できます。