7

Collection<B>があり、アイテムを削除しようとしているとします。最初の図に示すように、のインスタンスBは のインスタンスから参照され、 のインスタンスをA参照します。C

図A

ここで、B を指している参照があったため、オブジェクトが「削除」またはガベージ コレクションされていることに疑問の余地はありません。このようにコレクションから削除されるだけですよね?

図 B

ここで、Collection<A>前と同じ参照階層を持つ を作成し、A のインスタンスを削除しましょう。

図 C

への他の参照がない場合A、コレクションから削除されるだけでなく、ガベージとしてマークされます。私は正しいですか?そして と はどうBですかCBのインスタンスを参照する以外に他の参照がない場合、それらもガベージになりますCか?

これは私が直面していることの単純化です。コレクションからインスタンスを削除したいのですが、それを確認して使用したいと考えています。ABCAが私のコレクションになくなった時点で、まだ生きているすべての「子供」は、私にとってメモリ リークです。

私が作ったこれらの写真を見ると、あまりにもばかげた質問のように思えます. しかし、私の状況は少し些細なことではありません。次のようになります。

図4

  • 写真では、Modelレイヤーが黄色、ViewModelレイヤーが緑色
  • 「A ViewModel」クラスはそのA Model
  • にはインスタンスのコレクションがあります (モデルA Model層とビューモデル層の両方で、 の子のようなものです)B ModelBA
  • それぞれがB Model「その親を知っている」 - 親の「A Model」インスタンスを参照する
  • VMレイヤーに戻ると、「A ViewModel」は「B ViemModel」アイテムのコレクションを保持します
  • 優れたViewModelと同様に、「B ViewModel」は「B Model」を参照します

A ViewModelこれらのインスタンスのコレクションがあります。1つを削除すると、他のすべてが必要になります。関連するインスタンスへの「外部参照」が他にない場合 (基本的に、図の外から入ってくる他の矢印はありません)、削除された「A ViewModel」インスタンスはすべての子を取得しますか? もしそうなら、この単純化を誤解させる可能性のある「落とし穴」はありますか? もし私が完全に間違っているとしたら、なぜですか?:)

ここまで読んでくれてありがとう!

4

1 に答える 1

10

関連するインスタンスへの「外部参照」が他にない場合 (基本的に、図の外から入ってくる他の矢印はありません)、削除された「A ViewModel」インスタンスはすべての子を取得しますか?

はい、コードから子への参照がなければ、ガベージ コレクションの対象となり、最終的には収集する必要があります。

A への他の参照がない場合、コレクションから削除されるだけでなく、ガベージとしてマークされます。私は正しいですか?

それは実際にはこれがどのように機能するかではありません。GC は「ガベージを追跡」しません。代わりに、現在実行中のコードからのすべてのオブジェクト参照をチェックし、現在「生きている」参照を見つけ出します。その時点で残っているものは生きていないため、コレクションの対象になります。グラフ内の「B」または「C」に到達する唯一の方法が「A」のインスタンスを経由する場合で、コレクションから「A」を削除すると、それらすべてが GC の対象となり、次の適切な GC コレクション。

于 2013-11-05T00:25:55.897 に答える