16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【Java】GCのお勉強

GCの仕組みについてちょこっと調べたのでメモっておく。


0.GC(ガベージ・コレクション)とは
 JVMが持っている、メモリ領域の利用状況に応じて使用済みメモリ領域を回収するための仕組みのこと。


1.Javaのヒープ・メモリの構造


引用:@IT

 ・Javaのヒープ・メモリは、New領域とOld領域から構成される。
 ・New領域は、さらにEden領域、From領域、To領域に分けられる。
 ・オブジェクトが生成されたら、最初はまずEden領域に配置され、
  その後From/To領域⇒Old領域へと移動される(詳細は後述)。


2.GCの種類
 JVMには、「Scavenge GC」と「Full GC」という2種類のガベージ・コレクションがある。

 ・Scavenge GC(Copy GC):New領域を対象にしたGC。殆ど時間はかからない。
 ・Full GC:ヒープ領域全体を対象にしたGC。Scavenge GCに比べて時間がかかる。
 ※したがって、速度に影響するようなGCは、ほぼ全てFull GCである。


3.GCの仕組み
 3-1.Scavenge GCの仕組み
  Eden領域がいっぱいになると、Scavenge GCが実行される。
  Scavenge GCでは、Eden領域にあるまだ使用中のオブジェクトをTo領域へと移動させ、
  もう使われていないオブジェクトを破棄する。

  また、2回目以降のScavenge GCの際には、前回GC時のFrom領域とTo領域が入れ替わる。
  つまり、前回のGCでTo領域に移動されたオブジェクトは、
  今回のGCでは(それがまだ使用中であれば)Eden領域のオブジェクトと一緒にFrom領域に移動される。
  従って、使用中のオブジェクトはScavenge GCの度にFrom領域とTo領域を行き来するということである。
  この行き来が一定の回数に達すると、オブジェクトはOld領域へ移動される。
  この回数はMaxTenuringThresholdによって決められる。

 3-2.Full GCの仕組み
  Full GCには特に複雑な仕組みはない。
  もう使用されていないオブジェクトが破棄されるだけ。


4.GCの発生要因
 4-1.Scavenge GCの発生要因
  ・Eden領域へのJavaオブジェクトの配置で空き領域が不足

 4-2.Full GCの発生要因
  ・Scavenge GCの際に、Old領域の最大値に対する未使用メモリサイズよりも
   New領域で使用しているメモリサイズが大きい
  ・New領域とOld領域のそれぞれの未使用メモリサイズよりも、
   大きなメモリサイズのJavaオブジェクトの配置要求が発生
  ・Scavenge GC実施の結果、確保済みのOld領域での未使用メモリサイズが10000bytesを下回る
  ・Scavenge GC実施の結果、Old領域にオブジェクトが移動し、確保済みOld領域の拡張が発生


<参考>
 ここが大変だよ、JavaのGC/メモリ管理 - @IT
 Javaパフォーマンスチューニング(3):Javaのヒープ・メモリ管理の仕組み (1/2) - @IT


とまぁ簡単にですがこんなところ。

本当に調べたかったのはGCとFinalizerの関係だったのですが、
それはまた別の記事にメモします。