Java:这足以删除对象吗?

时间:2011-10-11 13:44:54

标签: java gwt garbage-collection hashmap

我有一个HashMap,可以保存对我的应用程序模块的引用。

HashMap<String, Module> modules;

当我这样做时:

for(String key:modules.keySet()){
   modules.remove(key);
}

不应再有对象的引用,因此GC应该在某些时候删除它们。我是对的还是我错过了什么?这是安全还是可以以某种方式重新获得对象的访问权?

这与执行时相同:

modules.clear();

最后一个更复杂的问题:当使用GWT执行此操作时,我能确定多少,对象在浏览器中消失了?我想在用户注销时执行此操作,以防止使用该计算机的人员从前一个用户检索任何信息。当然,大多数模块“忘记”他们的数据是unDetach(),但我不确定,他们都这样做。这个信息当然是个加分,如果有人碰巧知道我会感激=)

4 个答案:

答案 0 :(得分:5)

第一种方法可能会在迭代keySet并同时删除元素时导致问题。第二种方法应该做正确的事情。如果你没有其他模块参考,他们应该被垃圾收集。

答案 1 :(得分:3)

关于Java中垃圾收集的前几个问题:

HashMap的remove(key)方法是一种从集合中删除对象的安全方法。这样做将确保Collection不再引用该对象。但是,这本身并不保证该对象也没有被任何其他引用引用 - 您作为程序员必须确保这一点。如果确实没有其他参考,那么将在某个时间点收集该对象。 clear()方法也是如此。除非您对访问对象引用有任何其他编程错误,否则没有人可以访问这些垃圾对象。

注意:使用显式Iterator.remove()删除元素而不是for循环。您目前的方式很容易ConcurrentModificationException

答案 2 :(得分:1)

问题是谁以及还有什么可以访问您的模块。如果程序的某些其他部分可能已经获得对您的某个模块的引用,则无法确定GC是否会删除该模块。

在任何情况下,您都不应该依赖GC来做任何事情。它只会在需要更多空间时运行,并且是在应用程序完成执行后处理内存清理的系统。如果您想确保无法访问任何合理的信息,请明确删除它。

答案 3 :(得分:0)

只需在代码中插入此行:

modules = null;

然后GC检测到该对象没有更多的引用并清理它