2017-08-02 6 views
2

"若い世代を指し示す年長のオブジェクトがある場合、若いGCは効率が悪くなります"とは、不変オブジェクトを優先する理由の1つとして引用されています。世代別GCで不変オブジェクトがより効率的になるのはなぜですか?

  • コレクタが古い世代のオブジェクトに遭遇すると、正確にはどうなりますか?

  • なぜ若い世代のオブジェクトを参照して古いオブジェクトを収集するのは面倒なことでしょうか?

答えて

2

(若い世代の)エデンスペースを収集するには、エデンスペースから生存スペースのいずれかにライブオブジェクトがコピーされます。生存者空間にすでに存在するオブジェクトは、古い世代に昇格できるほど古い世代でない限り、 'from'スペースから 'to'スペースにコピーされます(この場合、そこにコピーされます)。

このすべてには、オブジェクトの再配置が必要です。これを行うには、古い世代のオブジェクトが新しい世代のオブジェクトを指している(マイナーGCで再配置されている)すべての参照が更新されている必要があります。再配置されるオブジェクトへの参照を持つオブジェクトが多くなればなるほど、マイナーGCの間にGCが行う作業が増えます。

不変オブジェクトのみを使用する場合、古いgenからのポインタを含むオブジェクトの数。若い世代に非常に小さい(おそらくゼロ)。これが起こる可能性があるのは2つの方法だけです:

  1. オブジェクトは古い世代に昇格します。それが を指しているオブジェクトはまだ生存者空間にいます。
  2. オブジェクトは古い世代で直接割り当てられるほど十分です。若い世代の対象を指しています。

解決策を要約すると、不変オブジェクトを使用することで、マイナーコレクション中にGCが更新する必要があるオブジェクト参照の数が減り、効率が向上します。

+0

なぜ参照を更新する必要がありますか? edenからsurvivorへのコピーにはオブジェクトリサイクルが含まれていますか? – IUnknown

+0

オブジェクトAがオブジェクトBを参照し、オブジェクトBが(Edenから生存者、生存者から生存者、または生存者から古い世代へ)再配置される場合、オブジェクトAの参照を更新する必要があります。以前にオブジェクトBによって占有されていたメモリの領域が再利用されると、オブジェクトA内の参照は全く異なるものになります。 – Speakjava

-1
  • コレクターは古い世代にこのようなオブジェクトに遭遇するとき、正確に何が起こる?それはどのようにそれを処理しますか?

典型的には、コレクタが古い世代のオブジェクトを収集する前に、それが若い世代では享受できなかったものを宣伝する前に、コレクタが親オブジェクトを収集できるかどうかを判断するまでには、若い世代ではより長い。若い世代のオブジェクトを渡ってくると何が起こるのか、それをスキップしなければならないのだろうと思っています。若い世代のGCと同じように数百から数千回スキップすることができます。

  • なぜ、年配世代のオブジェクトを参照する若いオブジェクトを収集するのは面倒ですか?古い世代のオブジェクトによって参照されている

それは古い世代から収集を開始する前に、若い世代がすべて解決されると何の問題ではない若い世代のオブジェクトによって参照され、それが効果的に若い世代の中で凍結されることを意味します。

私はあなたの未使用のオブジェクトをすべて参照解除することについて訓練されている限り、GCの効率を損なうことはありませんが、大きなアプリケーションでは余分な作業がたくさんかかることがあります。

関連する問題