13

私が間違っている場合は、遠慮なく訂正してください。JVMヒープには、古い世代と若い世代の2つの世代があります。フルGCを実行する場合、旧世代では、コンパクトスペースや穴の修正などの重い操作が行われるため、JVMがハングします。そして、若い世代では、軽量のGCが適用されており、検索結果から、若い世代に関係するEdenという別の領域があります。しかし、多くのドキュメントを検索した後でも、若い世代のGCについて2つの混乱があります。

  1. 若い世代では、GCは古い世代のGCが機能するように機能しないようです(つまり、古い世代のGCはコンパクトで穴を修正します)?もしそうなら、若い世代のGCはどのように機能しましたか?
  2. エデンスペースとは何ですか?このスペースは若い世代でどのように利用されていますか?初心者向けのドキュメントが推奨されるかどうかを評価します。
4

1 に答える 1

30

これは、覚えて理解する必要のある単一の最も重要な図です。

Javaメモリレイアウト
(出典: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は、保有スペースがいっぱいになると実行されます。

于 2012-12-01T15:49:33.440 に答える