javaのgcについて理解する〜基本的な仕組みへん

  Eden From To
|ーーーー|ーー|ーー|ーーーーーーーー|ーーーーーーーーーーーーーーーー|
|ーーーーーーーーーー|ーーーーーーーー|ーーーーーーーーーーーーーーーー|
    New         Old
|ーーーーーーーーーーーーーーーーーーー|ーーーーーーーーーーーーーーーー|
       heap               Permanent

■New世代GC
1. オブジェクトは生成され、Eden領域に割り当てられる
2. Eden領域が不足すると、New世代領域を対象にしたgcが実行される
2-1. Eden領域内のライブオブジェクトが検出され、To領域にコピーされる
2-2. このgcごとにFromとTo領域の役割が交代するので、領域名を形式的に入れ替える
3. 2に戻る
3-1. ただし、前回To領域(現在のFrom領域)も対象なので、Eden領域とFrom領域から現在のTo領域にコピーされる。

■Old世代GC(Full GC
1. New世代GC中は、長命オブジェクトはFromとToを行き来し、コスト面であまりよろしくないので、そのようなオブジェクトはOld領域へ異動させる
※そのため、各オブジェクトに年齢属性(GCの回数)をもたせてる。
2. Old領域のo空き領域が不足するとOld世代GCが実行される
2-1. Old領域内の非ライブオブジェクトのメモリ領域を解放する


・ヒープが小さい
 -> gcが頻発する
 ->必要量を下回るとOOMエラーが発生する
・ヒープサイズが大木
 -> gc1回あたりの処理時間(アプリケーションの停止時間)が長くなる
・-Xmsと-Xmxと異なる値に設定する
 -> JVMヒープが足りないと判断されたとき最大値まで拡大させる
 -> ヒープサイズのオーバーヘッドコストがかかる

GCの種類
・シリアルGC
・パラレルGC(-XX:+UseParallelGC、-XX:+UseParNewGC)
 ->複数スレッドを使って同時に実行できる※マルチコア環境ではこちらがデフォルト
 -> gc時間の現象、スループットの向上が期待できる
・コンカレントGC(-XX:+UseConcMarkSweepGC)
 -> アプリケーションと並行して処理できる(一部の処理のときのみ停止させる)
・ガベージファーストGC

http://www.atmarkit.co.jp/ait/articles/0404/02/news079.html
http://gihyo.jp/dev/serial/01/jvm-arc/0001
今回は基本へんなのでこの辺参考にしたけどちょっと古いので現バージョンのも調べなくては。