我有一个HashMap,可以保存对我的应用程序模块的引用。
HashMap<String, Module> modules;
当我这样做时:
for(String key:modules.keySet()){
modules.remove(key);
}
不应再有对象的引用,因此GC应该在某些时候删除它们。我是对的还是我错过了什么?这是安全还是可以以某种方式重新获得对象的访问权?
这与执行时相同:
modules.clear();
最后一个更复杂的问题:当使用GWT执行此操作时,我能确定多少,对象在浏览器中消失了?我想在用户注销时执行此操作,以防止使用该计算机的人员从前一个用户检索任何信息。当然,大多数模块“忘记”他们的数据是unDetach(),但我不确定,他们都这样做。这个信息当然是个加分,如果有人碰巧知道我会感激=)
答案 0 :(得分:5)
第一种方法可能会在迭代keySet并同时删除元素时导致问题。第二种方法应该做正确的事情。如果你没有其他模块参考,他们应该被垃圾收集。
答案 1 :(得分:3)
关于Java中垃圾收集的前几个问题:
HashMap的remove(key)
方法是一种从集合中删除对象的安全方法。这样做将确保Collection不再引用该对象。但是,这本身并不保证该对象也没有被任何其他引用引用 - 您作为程序员必须确保这一点。如果确实没有其他参考,那么将在某个时间点收集该对象。 clear()
方法也是如此。除非您对访问对象引用有任何其他编程错误,否则没有人可以访问这些垃圾对象。
注意:使用显式Iterator.remove()
删除元素而不是for
循环。您目前的方式很容易ConcurrentModificationException
。
答案 2 :(得分:1)
问题是谁以及还有什么可以访问您的模块。如果程序的某些其他部分可能已经获得对您的某个模块的引用,则无法确定GC是否会删除该模块。
在任何情况下,您都不应该依赖GC来做任何事情。它只会在需要更多空间时运行,并且是在应用程序完成执行后处理内存清理的系统。如果您想确保无法访问任何合理的信息,请明确删除它。
答案 3 :(得分:0)
只需在代码中插入此行:
modules = null;
然后GC检测到该对象没有更多的引用并清理它