これは、覚えて理解する必要のある単一の最も重要な図です。
(出典:oracle.com)
これは、Java SE 6 HotSpot [tm]仮想マシンのガベージコレクションのチューニングに由来し、GCの内部に関するすべてを学ぶためのワンストップの場所です。しかし、あなたの当面の質問に対処するには:
new
演算子(ほぼ)を使用した新しいオブジェクトの割り当ては、常にエデン空間で行われます。しかし、エデンは実際にはスタックです。Nバイトを必要とする新しいオブジェクトを作成すると、単一のポインターがそのスタック上でNバイト進み、それだけです。割り当ては非常に高速で、フリースポットを検索したり、圧縮したりする必要はありません。
もちろん、このスタックは無限ではありません。ある時点でそのスタックが終了し、マイナーGCがトリガーされます。また、ほとんどの場合、複数のオブジェクトはすでにゴミです。したがって、マイナーGCでJVMが行うことは次のとおりです。
GCルートから始まるオブジェクトのトラバースグラフ
GCルートからサバイバースペースの1つに到達可能なすべてのオブジェクトをコピーします(ギャップはありません。すべてのオブジェクトを認識しており、これは単一のプロセスです)
エデンスペースを一掃します(基本的には、このスタックポインタをに戻すだけです0
)
後続のマイナーコレクションには、追加の手順があります。
- サバイバースペースの1つも調べられます。エデンとサバイバースペースの1つからのライブオブジェクトは、2番目のサバイバースペースにコピーされます。これは、常に1つの無料のサバイバースペースがあることを意味します。
では、オブジェクトはどのように終身世代で終わるのでしょうか?最初の若いオブジェクトは、サバイバースペースの1つにコピーされます。次に、それらは他に何度も何度もコピーされます。与えられたオブジェクトが何度も前後にジャンプすると(構成可能、デフォルトでは8)、そのオブジェクトはテニュアスペースに昇格します。
メジャーGCは、保有スペースがいっぱいになると実行されます。