2

我有一个游戏对象的 HashMap。每个 Game 对象都包含一个玩家的 HashMap 和一个移动列表。游戏结束后,我想将其从地图中删除。我应该在删除游戏对象之前清空玩家地图和移动列表还是 GC 会处理它?

是的,这是一个新手问题,对此感到抱歉;)

4

2 回答 2

10

你不需要做任何事情。

只要整个对象图没有被任何对象引用,GC 就会自动收集整个对象。

有根对象是保证不可收集的对象 - 由静态字段或任何线程中的活动堆栈帧引用的对象。

于 2013-06-13T18:36:34.590 回答
3

如果您从 Game 对象中引用 Players HashMap 并且当您的游戏结束时,并且您正在将其从地图中删除,则玩家地图也将被删除,因为它是从游戏中引用的。

当对游戏的引用丢失时,所有从游戏引用的对象如果不是来自外部游戏对象的引用,也会丢失

好吧,让我们通过一个例子来理解这一点。

  • 我们有一个 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()一个对象,并且因为 a是它的实例变量,所以也创建了 a。将作为房间使用的参考。此时,我们可以直接访问,并且可以使用 room 访问它。所以对象将通过.RoomDoordoordoorroom.doorroomdoordoorroom

现在,当我们这样做时room = null,我们失去了对Room对象的引用。由于Door对象仅通过 引用Room,我们失去了它的唯一引用。由于room = null我们无法访问room.door.

这被图解地称为如下

在此处输入图像描述

第一张图片显示了Room room = new Room();执行时的条件。它参考了门。

第二张图表示之后的情况room = null。请注意,虚线表示参考丢失。现在参考Room丢失了,显然 fordoor也丢失了。

在这个时间点......两个对象都将有资格进行垃圾收集

希望这个答案有点帮助:)

于 2013-06-13T18:38:39.000 回答