1. ホーム
  2. java

[解決済み] Java GC: なぜ生存者領域が2つあるのか?

2023-07-16 05:45:37

質問

Sun/Oracle の JVM では、GC アルゴは新しい世代を 1 つの Eden 地域と 2 つの生存地域に分割すると読みました。私が疑問に思っているのは、なぜ 1 つではなく、2 つの生存者地域に分かれているのか、ということです。アルゴは Eden とただ 1 つの生存者領域の間でピンポンし続けることができます (現在 2 つの生存者領域の間で行っている方法です)。

どのように解決するのですか?

JRockitのGC実装は、ご指摘のように、単一のedenと単一の生存空間だけで動作すると思いますが、それを引用しないでください。

HotSpot JVMの2つの生存者空間の理由は、断片化に対処する必要性を減らすためです。新しいオブジェクトは eden スペースに割り当てられます。すべて順調です。それが一杯になったら、GCが必要になります。そこで、古くなったオブジェクトを殺して、生きているオブジェクトを生存者スペースに移動させ、そこで古い世代に昇格する前にしばらくの間熟成させます。ここまではまだいい。しかし、次にエデンスペースが足りなくなると、難問が発生します。次のGCが来て、エデンスペースとサバイバースペースの両方を空けるのですが、スペースは連続していません。そこで、次のようにするのがよいのでしょうか。

  1. エデンの生存者を、GCによって空けられた生存者空間の穴にはめ込もうとするのか?
  2. 生存者空間のすべてのオブジェクトを下にずらして、断片化を解消し その後 に生存者を移動させるのですか?
  3. もういいや、どうせ全部移動させるんだから」といって、両方のスペースからすべての生存者を完全に別のスペース(2番目の生存者スペース)にコピーして、きれいなエデンと生存者スペースを残し、次のGCで同じことを繰り返せばいいのでしょうか?

この質問に対する Sun の答えは明白です。