2

Game オブジェクトの HashMap があります。各 Game オブジェクトには、プレイヤーの HashMap と Move のリストが含まれています。ゲームが終わったら、マップから削除したい。ゲーム オブジェクトを削除する前にプレイヤーのマップとムーブ リストを空にするべきですか、それとも GC が処理しますか?

はい、初歩的な質問ですみません(;_;)

4

2 に答える 2

10

何もする必要はありません。

オブジェクト グラフ全体がルート化されたオブジェクトによって参照されない限り、GC はすべてを自動的に収集します。

ルート化されたオブジェクトは、収集できないことが保証されているオブジェクトです。静的フィールドまたは任意のスレッドのアクティブなスタック フレームによって参照されるオブジェクトです。

于 2013-06-13T18:36:34.590 に答える
3

Players HashMap を Game オブジェクトから参照していて、ゲームが終了したときにマップから削除すると、ゲームから参照されているため、players マップも削除されます。

ゲームへの参照が失われると、ゲームから参照されたすべてのオブジェクトも、それらが外部のゲーム オブジェクトから参照されていない場合は失われます。

例を使ってこれを理解しましょう。

  • Door クラスと Room クラスがあります。
  • 部屋にはドアがあり、部屋なしでは存在できません。

このコードを見てみましょう

public class Room {
Door door = new Door();
    public static void main(String[] args) {
        Room room = new Room();
        room = null;
    }

}

ここで、 と書くRoom room = new Room()Roomオブジェクトが作成され、aDoorはそのインスタンス変数なので、adoorも作成されます。はdoorを使用して部屋から参照されますroom.door。この時点で、room直接doorアクセスでき、部屋を使用してアクセスできます。したがって、doorオブジェクトは を介し​​て参照されroomます。

を実行するroom = nullと、オブジェクトへの参照が失われRoomます。Doorオブジェクトは を介し​​てのみ参照されるためRoom、唯一の参照が失われます。room = nullアクセスできないのでroom.door

これを図式的に表すと次のようになります

ここに画像の説明を入力

最初の画像は、Room room = new Room();gets が実行されたときの状態を示しています。ドアへの言及があります。

2番目の画像は後の状態を示していますroom = null。点線は参照が失われていることを示していることに注意してください。現在、 の参照Roomが失われ、明らかに のdoorも失われています。

この時点で...両方のオブジェクトがガベージ コレクションの対象となります

この答えが少し役立つことを願っています:)

于 2013-06-13T18:38:39.000 に答える