Garbage Collectionについてちょっと調べてみた

HBaseのJuliet PauseをきっかけにしてGarbage Collection(以下GC)についてちょっと調べてみました。そういえば長年Javaでお仕事している割にはGCのこと全然知らなかった(汗

GCというのは不要になったメモリを回収することをいいますがそのアルゴリズムにはいくつかあって代表的なものとして以下の2つがあります。

  • Mark Sweep GC
  • Coping GC

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 GCGCスレッドとアプリケーションが同時に実行されます。

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問題を回避できるのかもしれません。


参考にしたもの


Hadoop徹底入門

Hadoop徹底入門

10章のGCのあたりね


ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装

アルゴリズム編をざっと読んだけど結構難しい


徹底解剖「G1GC」 アルゴリズム編 - 達人出版会
ざっと読んだけど結構難しい


徹底解剖「G1GC」実装編
ちらっと見ただけw


「メモリーを意識してみよう」第4回 進化するメモリー管理 | 日経 xTECH(クロステック)


「Java SE 6完全攻略」Garbage First GC | 日経 xTECH(クロステック)
会員登録が必要です。。。


“Stop the World”を防ぐコンカレントGCとは? (1/2):現場から学ぶWebアプリ開発のトラブルハック(2) - @IT


p10がポイントだけど最初から読んでね。そうじゃないと面白くないから。