【发布时间】:2012-05-04 06:01:43
【问题描述】:
我正在像这样创建一个新的演示者:
new MyPresenter(new MyView());
它注册一些事件处理程序并绑定到视图等。最终,我可能会“关闭”该视图,使其不再由浏览器呈现。我不会在任何地方维护对 MyPresenter 实例的引用。
在有关此主题的 Google 论坛中,传统的反应是“将您的引用设置为空”,然后不用担心。与 Javascript 不同,出于显而易见的原因,我不能只在 Java 中说 this = null;。但在 Javascript 中,很容易将我知道将不再使用的对象引用清空。
我的问题:由于我没有维护对它的引用,我如何判断该演示者是否已被垃圾收集?它非常明显地存在。我是否应该相信 GWT 和 JS 会解决这个问题?还是我需要维护自己对MyPresenter 的引用,以便在完成后手动null?
【问题讨论】:
-
取决于浏览器。基本上,如果您没有对对象的引用,它将被收集,但是存在错误,例如 IE 中著名的错误,DOM 和 JS 对象之间的交叉引用(GWT 中的默认组件通常受到保护),或者一些垃圾收集器无法删除对象岛。由于有很多浏览器,因此没有通用的技巧或工具来解决这个问题。唯一的选择是运行性能测试,并检查内存使用情况。
-
我曾经在我的(用户)代码中没有对该对象的引用,但是它可以证明是存在的,因为如果我触发它们,它可以处理事件。但是,如果我删除这些事件处理程序并将
MyView设为空,是否足以导致它被 GC 处理?我担心事实并非如此。 -
@TravisWebb 应该足够了。但意外时有发生。我无法将所有与 GC 相关的错误都放在一个 cets 中,但它们有时会发生。如果您删除对对象的所有引用,则应该收集它(添加一些东西作为事件侦听器,算作创建引用,因为某处的某些对象必须知道将事件发送到哪里)
-
好的。实际上,事件处理程序是一个匿名类。希望我能得到一些更具体的信息。
-
developers.google.com/web-toolkit/articles/…有一些关于 GWT 处理浏览器问题的信息
标签: java javascript gwt garbage-collection