Garbage Collectionについてちょっと調べてみた
HBaseのJuliet PauseをきっかけにしてGarbage Collection(以下GC)についてちょっと調べてみました。そういえば長年Javaでお仕事している割にはGCのこと全然知らなかった(汗
GCというのは不要になったメモリを回収することをいいますがそのアルゴリズムにはいくつかあって代表的なものとして以下の2つがあります。
Mark Sweep GCはオブジェクトをアプリケーションからたどっていってMarkしていきます。Markが無いのは使われていないオブジェクトなのでSweepします。メリットは実装が簡単なことでデメリットはメモリの断片化、フラグメンテーションが起きることです。
Coping GCはヒープ領域を2つに分けてオブジェクトをコピーしたり移動したりすることです。メリットはスループットが高いことやフラグメンテーションがおきないことでデメリットはメモリの使用効率が悪いことです。
で、上記2つとは別に世代別GCというのもあります。これはそれ単体でGCを行うものじゃなくてMark Sweep GCやCoping GCなどの基本アルゴリズムと組み合わせて使います。世代別GCでは多くのオブジェクトは短命で死ぬという経験則のもとヒープ領域をnew領域とold領域を2つに分けます。前者に対するGCをminor GC、後者に対するGCをmajor GCと呼びます。new領域で生き残ったオブジェクトはold領域に移動します。
Javaでもこの方式を使っていて、ざっくりいうとminor GCにCoping GCを使っていて、major GCというかヒープ領域全体のGCつまりFull GCにはMark Sweep GCを使っています。
Full GCが実行されるためアプリケーションが停止する状況をStop the Worldといいます。
なんでアプリケーションが停止するかというとそうしないとオブジェクトの参照関係が変わってしまい誤ってまだ必要なオブジェクトをGCしてしまう危険性があるためです。
とはいえなるべくアプリケーションの停止時間を短くしたいのでそのための努力が行われています。
ただし一番長い停止時間、最大停止時間とGCのスループットはトレードオフの関係にあるためそのバランスを取る必要があります。
スループットをあげるために直列(serial)じゃなくて並列でGCを実行するという手段があるのですが、ここで並列(parallel)と並行(concurrent)の違いを書いておきます。
Parallel GCはアプリケーションが停止して複数のGCスレッドが実行されます。一方Concurrent GCはGCスレッドとアプリケーションが同時に実行されます。
Javaの場合new領域ではParallel GCが実行され、old領域というかFull GC時にはConcurrent GCが実行されます。Concurrent Mark Sweep GCというものです。
Initial MarkはルートからたどれるオブジェクトだけMarkしてその子供はチェックしません。子供をチェックするのはConcurrent Mark。Concurrent Markはアプリケーションと同時に動いているのでオブジェクトの参照関係が変わって不整合が発生する可能性があります。それをチェックするためにRemarkがあります。Initial MarkとRemarkの時はアプリケーションは停止します。最後のConcurrent Sweepでオブジェクトを回収します。Java6まではこうでした。
Java SE 7 Update 4では、新ガーベジ・コレクション(GC)として「G1 GC」が追加されました。Java6でもupdate 14からG1GCは実験的に導入されているようです。これはヒープをリージョンという固定領域の単位で分割してGCを実行するものです。ユーザが停止時間を指定できるのがうりです。ま、詳しいことはよくわかりませんがwこれでJuliet Pause問題を回避できるのかもしれません。
参考にしたもの
- 作者: 太田一樹,下垣徹,山下真一,猿田浩輔,藤井達朗,濱野賢一朗
- 出版社/メーカー: 翔泳社
- 発売日: 2011/01/28
- メディア: 大型本
- 購入: 14人 クリック: 668回
- この商品を含むブログ (43件) を見る
- 作者: 中村成洋,相川光,竹内郁雄
- 出版社/メーカー: 秀和システム
- 発売日: 2010/03/17
- メディア: 単行本
- 購入: 25人 クリック: 810回
- この商品を含むブログ (94件) を見る
徹底解剖「G1GC」 アルゴリズム編 - 達人出版会
ざっと読んだけど結構難しい
徹底解剖「G1GC」実装編
ちらっと見ただけw
「メモリーを意識してみよう」第4回 進化するメモリー管理 | 日経 xTECH(クロステック)
「Java SE 6完全攻略」Garbage First GC | 日経 xTECH(クロステック)
会員登録が必要です。。。
“Stop the World”を防ぐコンカレントGCとは? (1/2):現場から学ぶWebアプリ開発のトラブルハック(2) - @IT
p10がポイントだけど最初から読んでね。そうじゃないと面白くないから。