java垃圾回收问题

时间:2013-06-13 18:35:21

标签: java garbage-collection

我有一个游戏对象的HashMap。每个Game对象都包含一个玩家的HashMap和一个Move列表。当游戏结束时,我想将其从地图中删除。在删除游戏对象之前,我是否要清空玩家地图和移动列表?或者GC会处理它吗?

是的,这是一个新手问题,对不起;)

2 个答案:

答案 0 :(得分:10)

您无需做任何事情。

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

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

答案 1 :(得分:3)

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

当对游戏的引用丢失时,如果不是从外部游戏对象引用,那么从游戏中引用的所有对象也将丢失

让我们用一个例子来理解这一点。

  • 我们有门课和房间课
  • 一个房间将有一扇门,没有房间就不能存在。

让我们看看这段代码

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

}

在这里,当我们编写Room room = new Room()时,将创建一个Room对象,并且因为Door是它的实例变量,所以还会创建doordoor将使用room.door从房间引用room。 此时,我们可以直接访问door,并且可以使用会议室访问其door。因此,room对象将通过room = null引用。

现在,当我们执行Room时,我们将失去对Door对象的引用。由于Room对象仅通过room = null引用,因此我们失去了唯一的引用。由于room.door我们无法访问Room room = new Room();

以图解方式引用如下

enter image description here

第一张图显示执行room = null时的情况。 它提到了门。

第二个图像表示Room之后的条件。请注意,虚线表示参考丢失。现在door的引用已丢失,显然{{1}}也丢失了。

此时......两个对象都有资格进行垃圾收集

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