■ GCの種類
[1] マイナーGC / Scavenge GC(スキャベンジ・ジーシー) [2] メジャーGC / Full GCJava のメモリ構造については、以下の関連記事を参照のこと。
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:gc | GCログの有効化 |
2 | -Xloggc:【GCログファイルパス】 | 出力したGCログを指定したファイルへ出力する |
3 | -XX:+PrintGCDetails | GCログの詳細表示 |
4 | -XX:+PrintGCDateStamps | 日付/時間を追加 |
5 | -XX:+UseGCLogFileRotation | GCログのローテーション |
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
参考文献
GC実行方式の種類http://gihyo.jp/dev/serial/01/jvm-arc/0004
http://gihyo.jp/dev/serial/01/jvm-arc/0009
コンカレントGC
http://www.atmarkit.co.jp/ait/articles/0704/24/news136.html
JVMオプション
https://qiita.com/YN0314/items/5e5c57d52ac1379daf6d
https://access.redhat.com/ja/node/205233
https://qiita.com/i_matsui/items/aabbdaa169c6ae51ecb3
http://fomsan.sakura.ne.jp/memo/java/javaVMOptions.html
公式サイト
JVMオプションhttps://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/cms.html