Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:这足以删除对象吗?_Java_Gwt_Garbage Collection_Hashmap - Fatal编程技术网

Java:这足以删除对象吗?

Java:这足以删除对象吗?,java,gwt,garbage-collection,hashmap,Java,Gwt,Garbage Collection,Hashmap,我有一个HashMap,它保存对我的应用程序模块的引用 HashMap<String, Module> modules; 不应该有更多的对象引用,因此GC应该在某个时候删除它们。我是对的还是我错过了什么?这是安全的还是有可能以某种方式重新访问对象 这与执行以下操作时发生的情况相同: modules.clear(); ? 最后还有一个更复杂的问题:当使用GWT执行此操作时,我能确定多少,即这些对象在浏览器中消失了?我想在用户注销时这样做,以防止有人使用旁边的计算机从以前的用户检索任

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

HashMap<String, Module> modules;
不应该有更多的对象引用,因此GC应该在某个时候删除它们。我是对的还是我错过了什么?这是安全的还是有可能以某种方式重新访问对象

这与执行以下操作时发生的情况相同:

modules.clear();
?


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

第一种方法可能会在迭代键集并同时删除元素时导致问题。第二种方法应该做正确的事情。如果没有对模块的其他引用,则应该对其进行垃圾收集。

第一种方法可能会在迭代键集并同时删除元素时导致问题。第二种方法应该做正确的事情。如果没有对模块的其他引用,则应该对其进行垃圾收集。

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


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

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


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

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

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


注意:使用显式的
迭代器.remove()
删除元素,而不是
for
循环。对于与Java中的垃圾收集相关的前几个问题,您当前的方式很容易出现
ConcurrentModificationException

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


注意:使用显式的
迭代器.remove()
删除元素,而不是
for
循环。您当前的方式容易出现
ConcurrentModificationException

只需在代码中插入这一行:

modules = null;

然后GC检测到该对象上没有更多的引用,并将其清除

只需在代码中插入这一行:

modules = null;

然后GC检测到该对象上没有更多的引用,并将其清除

“明确地删除”-如果不设置为null,如何执行此操作?手动将所有您认为“危险”的信息设置为null,而不是希望GC清除对象和所有包含的数据。从您的问题中,我推测您已经考虑过类似于您的
onAttach()
回调的内容。“明确地删除它”-如果不设置为null,如何执行该操作?手动将所有您认为“危险”的信息设置为null,而不是希望GC清理对象和所有包含的数据。从您的问题中,我推断您已经考虑过使用
onAttach()
callback进行类似的操作。GC和GWT有什么共同点?您必须记住,GWT代码被编译成Javascript并在浏览器中运行,而不是在VM的服务器上运行。GC和GWT有什么共同点?您必须记住,GWT代码被编译成Javascript并在浏览器中运行,而不是在VM的服务器上运行。