Javaはどのように動くのか~図解でわかるJVMの仕組み

第7回 HotSpot JVMではどのようにオブジェクトが移動するのか

この記事を読むのに必要な時間:およそ 2 分

1回目のマイナーGCまでの流れを把握する

前回は,HotSpot JVM(以下HotSpot)のヒープ構造を解説しました。今回は,HotSpot JVMの4つのヒープ領域がどのように使用されていくのかを見ていきましょう。

まず,アプリケーションがオブジェクトを作成すると,HotSpotはそのオブジェクトにEden領域を割り当てます。

図1 オブジェクトが生成されるとEden領域が割り当てられる

図1 オブジェクトが生成されるとEden領域が割り当てられる

アプリケーションが処理を実行していくと,オブジェクトがどんどん作成されていきます。その結果,Eden領域が次々と使用されていきます。

Eden領域がいっぱいになり,空き領域がなくなると,HotSpotはNew領域を対象にGCを行います。このGCは「マイナーGC」と呼ばれ,世代別GCで言う「若い世代のGC」になります。

このように,Eden領域で短命なオブジェクトを回収することで,ヒープを再利用できるようにするわけです。

図2 マイナーGC前のヒープ

図2 マイナーGC前のヒープ

1回目のマイナーGCでは,以下の構成でコピーGCが行われます。

  • From領域 ⇒Eden領域,Survivor 0領域
  • To領域 ⇒Survivor 1領域

図3 1回目のマイナーGCでの各領域の役割

図3 1回目のマイナーGCでの各領域の役割

しかし,1回目のマイナーGCではSurvivor 0領域にはオブジェクトが割り当てられてないため,生きているオブジェクトはEden領域からのみコピーされます。

図4 1回目のマイナーGCでのコピーGC

図4 1回目のマイナーGCでのコピーGC

マイナーGCのコピー処理が終わると,Eden領域にある「死んだオブジェクト」「コピーされたオブジェクト」が削除されます。これにより,解放されたEden領域が再利用できるようになります。

そして,Survivor 1領域が新たなFrom領域となり,Survivor 0領域は新たなTo領域となります。

図5 1回目のマイナーGC後のヒープ

図5 1回目のマイナーGC後のヒープ

2回目のマイナーGCでは動作が異なる

1回目のGCが終わり,再びアプリケーションが処理を実行していくと,オブジェクトが作成されていきます。再びEden領域がいっぱいになって空き領域がなくなると,2回目のマイナーGCが実行されます。

2回目のマイナーGCでは,以下の構成でコピーGCが行われます。

  • From領域 ⇒Eden領域,Survivor 1領域
  • To領域 ⇒Survivor 0領域

図6 2回目のマイナーGCでの各領域の役割

図6 2回目のマイナーGCでの各領域の役割

Survivor 1領域には,前回のマイナーGCで生き残ったオブジェクトがあるため,1回目のGCとわずかに動作が異なります。

Survivor 1領域にあるオブジェクトの中には,引き続き生きているオブジェクトと,1回目のGC以降に死んでしまったオブジェクトがあります。2回目のGCでは,以下のオブジェクトが,To領域であるSurvivor 0領域へコピーされます。

  • Eden領域にある生きているオブジェクト
  • Survivor 1領域で引き続き生きているオブジェクト

図7 2回目のマイナーGC

図7 2回目のマイナーGC

オブジェクトのコピーが終わると,New領域を再利用するために,以下のオブジェクトが削除されます。

  • Eden領域にある「死んだオブジェクト」「コピーされたオブジェクト」
  • Survivor 1領域にある「すべてのオブジェクト」

そして,Survivor 0領域をFrom領域,Survivor 1領域をTo領域に変更して,GCを終了します。

図8 2回目のマイナーGC後のヒープ

図8 2回目のマイナーGC後のヒープ

3回目以降のマイナーGCでは,Survivor 0と1領域の役割がFrom領域とTo領域で入れ替わって実行されます。

著者プロフィール

伊藤智博(いとうちひろ)

日本オラクル(株)コンサルティングサービス統括所属。アプリケーションアーキテクトやM/Wコンサルとして,Javaに限らずさまざまな言語での開発/支援を経験。アプリ ケーションだけでなくミドルウェア,データベース,OS,ハードウェアにも興味アリ。現在,以下のコミュニティの活動に協力している。

Japan Oracle User Group(JPOUG)
Oracle LOVERS

ブログ:http://chiroito.blogspot.jp/
Twitter:@chiroito

コメント

コメントの記入