Game オブジェクトの HashMap があります。各 Game オブジェクトには、プレイヤーの HashMap と Move のリストが含まれています。ゲームが終わったら、マップから削除したい。ゲーム オブジェクトを削除する前にプレイヤーのマップとムーブ リストを空にするべきですか、それとも GC が処理しますか?
はい、初歩的な質問ですみません(;_;)
Game オブジェクトの HashMap があります。各 Game オブジェクトには、プレイヤーの HashMap と Move のリストが含まれています。ゲームが終わったら、マップから削除したい。ゲーム オブジェクトを削除する前にプレイヤーのマップとムーブ リストを空にするべきですか、それとも GC が処理しますか?
はい、初歩的な質問ですみません(;_;)
何もする必要はありません。
オブジェクト グラフ全体がルート化されたオブジェクトによって参照されない限り、GC はすべてを自動的に収集します。
ルート化されたオブジェクトは、収集できないことが保証されているオブジェクトです。静的フィールドまたは任意のスレッドのアクティブなスタック フレームによって参照されるオブジェクトです。
Players HashMap を Game オブジェクトから参照していて、ゲームが終了したときにマップから削除すると、ゲームから参照されているため、players マップも削除されます。
ゲームへの参照が失われると、ゲームから参照されたすべてのオブジェクトも、それらが外部のゲーム オブジェクトから参照されていない場合は失われます。
例を使ってこれを理解しましょう。
このコードを見てみましょう
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
も失われています。
この時点で...両方のオブジェクトがガベージ コレクションの対象となります
この答えが少し役立つことを願っています:)