JVM GCは、マイナーGCで収集できるため、短命のオブジェクトを好む理由を知っています。しかし、なぜJVMGCは不変オブジェクトを愛するのでしょうか。
編集:チャーリーハントは、GCが彼のプレゼンテーションで不変のオブジェクトを愛していると言います。
ありがとう
JVM GCは、マイナーGCで収集できるため、短命のオブジェクトを好む理由を知っています。しかし、なぜJVMGCは不変オブジェクトを愛するのでしょうか。
編集:チャーリーハントは、GCが彼のプレゼンテーションで不変のオブジェクトを愛していると言います。
ありがとう
オブジェクトにgen0オブジェクトへの参照が含まれていないことをGCが認識できる場合は、gen0コレクションを実行するときに無視できます。同様に、オブジェクトにgen0またはgen1オブジェクトへの参照が含まれていない場合、gen1コレクションを実行するときに無視される可能性があります。コレクション中に無視できるオブジェクトが多いほど、そのコレクションは高速になります。
オブジェクトがgen0GCを存続する場合、参照を保持していたすべてのgen0オブジェクトがgen1にプロモートされていることを確認できます。同様に、gen0参照を含まないオブジェクトがgen1 GCを存続する場合、そのオブジェクトに含まれるgen1参照はgen2にプロモートされます。したがって、オブジェクトがgen0コレクション中に検査された後は、変更されない限り、次のgen1コレクションまで再度検査する必要はありません。同様に、gen1コレクション中に検査されるオブジェクトは、変更されない限り、次のgen2コレクションまで検査される必要はありません。
オブジェクトが変更されているかどうかを知ることは難しい問題ですが、重要な点は、オブジェクトが変更されていない場合、GCにとって非常に有利であるということです。
リンクをありがとう..それは素晴らしいと思いました:)
プレゼンテーションから:GCは、小さな不変オブジェクトと短命のオブジェクトが大好きです。
編集:
小さいオブジェクトはメモリフットプリントが短いため、収集後、メモリ圧縮のオーバーヘッドはそれほど大きくありません(GCによって再利用された後、大きなメモリホールが残るため、大きいオブジェクトのメモリ圧縮は遅くなります)。また、短命のオブジェクトは、マイナーなGCサイクルで収集されるため、優れています。
ブライアン・ゲッツの記事から答えを見つけました。
ほとんどの場合、ホルダーオブジェクトが更新されて別のオブジェクトを参照すると、新しい指示対象は若いオブジェクトになります。setValue()を呼び出してMutableHolderを更新すると、古いオブジェクトが若いオブジェクトを参照する状況が発生します。一方、代わりに新しいImmutableHolderオブジェクトを作成することにより、若いオブジェクトは古いオブジェクトを参照します。ほとんどのオブジェクトが古いオブジェクトを指している後者の状況は、世代別のガベージコレクターの方がはるかに穏やかです。古い世代に存在するMutableHolderが変異している場合、MutableHolderを含むカード上のすべてのオブジェクトをスキャンして、次のマイナーコレクションで古いものから若いものへの参照を探す必要があります。存続期間の長いコンテナオブジェクトに可変参照を使用すると、収集時に古い参照から若い参照を追跡するために行われる作業が増えます。