【Java】ガベージコレクション ( Barbage Collection; GC )

ガベージコレクション

Barbage Collection(GC)
 * 不要になったメモリ領域を自動的に解放する機能

GCの種類

[1] マイナーGC / Scavenge GC(スキャベンジ・ジーシー)
[2] メジャーGC / Full GC
Java のメモリ構造については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/33622631.html

[1] マイナーGC / Scavenge GC

 * NEW領域のみを対象としたガベージ・コレクション
 * 頻繁に実施
 * インスタンスが不要になるまでの間、From領域とTo領域の間でインスタンスの移動を繰り返す

[2] メジャーGC / Full GC

 * NEWとOLD両方の領域を対象としたガベージ・コレクション

GC実行方式の種類

[1] シリアルGC
[2] パラレルGC
[3] コンカレントGC

[1] シリアルGC

 * 全アプリケーションスレッドを停止し、1つのスレッドでGC実行
欠点
 * GCによる停止時間ができてしまう

[2] パラレルGC

 * シリアルGCと同じくすべてのアプリケーションスレッドを停止しながらも複数のスレッドでGCを実行する
 => アプリケーションの停止時間を短縮する(ただし、少なからずアプリケーションスレッドの停止時間は発生する)
欠点
 * GCスレッド間の同期などにオーバーヘッドがかかり、GCスレッドの処理時間が増加する

[3] コンカレントGC

 * アプリケーションスレッドと同時にGCスレッドを動作させること
 => アプリケーションと同時に実行するため、停止時間は短縮
欠点
 * 全体的なスループット(ある単位時間当たりの処理能力)は下がり、応答時間も遅くなる

GC関連のオプション

GCログ出力

 -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=5
`#`オプション説明
1-verbose:gcGCログの有効化
2-Xloggc:【GCログファイルパス】出力したGCログを指定したファイルへ出力する
3-XX:+PrintGCDetailsGCログの詳細表示
4-XX:+PrintGCDateStamps日付/時間を追加
5-XX:+UseGCLogFileRotationGCログのローテーション
6-XX:GCLogFileSize=【GCログファイルサイズ】ローテーションファイルの閾値
7-XX:NumberOfGCLogFiles=【GCログファイル世代数】ローテーションファイルの世代数

コンカレントGCの有効化

 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
`#`オプション説明
1-XX:+UseConcMarkSweepGCコンカレントGCの有効化
2-XX:+CMSIncrementalModeインクリメンタル・モードの有効化(Java SE 8で非推奨)

補足:Tomcatでの指定

 * 以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/33222763.html


関連記事

JavaJava のメモリ構造

https://blogs.yahoo.co.jp/dk521123/33622631.html

JavaJVMのメモリ情報を出力させる

https://blogs.yahoo.co.jp/dk521123/33278121.html

Java】オブジェクトの使用メモリサイズを測る

https://blogs.yahoo.co.jp/dk521123/32945695.html

TomcatTomcat ログあれこれ

https://blogs.yahoo.co.jp/dk521123/33222763.html