我有一个游戏对象的HashMap。每个Game对象都包含一个玩家的HashMap和一个Move列表。当游戏结束时,我想将其从地图中删除。在删除游戏对象之前,我是否要清空玩家地图和移动列表?或者GC会处理它吗?
是的,这是一个新手问题,对不起;)
答案 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
是它的实例变量,所以还会创建door
。 door
将使用room.door
从房间引用room
。
此时,我们可以直接访问door
,并且可以使用会议室访问其door
。因此,room
对象将通过room = null
引用。
现在,当我们执行Room
时,我们将失去对Door
对象的引用。由于Room
对象仅通过room = null
引用,因此我们失去了唯一的引用。由于room.door
我们无法访问Room room = new Room();
。
以图解方式引用如下
第一张图显示执行room = null
时的情况。
它提到了门。
第二个图像表示Room
之后的条件。请注意,虚线表示参考丢失。现在door
的引用已丢失,显然{{1}}也丢失了。
此时......两个对象都有资格进行垃圾收集
希望这个答案有点帮助:)