我创建一个新的主持人,像这样:GWT垃圾收集
new MyPresenter(new MyView());
它注册了一些事件处理程序和绑定到视图和这样。最终,我可能会“关闭”该视图,以便它不再由浏览器呈现。我并没有在任何地方保留对这个MyPresenter
这个实例的引用。
在关于此主题的Google论坛中,常规回答是“将您的引用设置为null”,然后不必担心。与JavaScript不同,我不能只用Java中的this = null;
来说明原因。但在Javascript中,很容易清空我知道不再使用的对象引用。
我的问题:我怎么知道这个主持人是否被垃圾收集,因为我没有保留对它的引用?它非常清楚地存在。我应该相信GWT和JS会照顾这个吗?或者我需要维护自己对MyPresenter
的引用,以便我可以在完成后手动执行null
?
这取决于浏览器。基本上,如果你没有对象的引用,它将被收集,但有bug,像IE中的着名的错误,DOM和JS对象之间的交叉引用(GWT中的默认组件通常被保护),或一些垃圾收集器无法删除对象岛。由于有很多浏览器,所以没有通用的技巧或工具来解决这个问题。唯一的选择是运行性能测试,并检查内存使用情况。 – jusio 2012-04-23 15:51:19
我不**曾经从我的(用户)代码中引用该对象,但它可以存在,因为它可以处理事件,如果我将它们解雇。但是,如果我删除这些事件处理程序并将'MyView'清空足以导致GC'd?我的恐惧是,事实并非如此。 – 2012-04-23 16:04:44
@TravisWebb它*应该*足够。但是意外发生了。我无法评论所有与GC有关的bug,但它们发生在时间之后。如果你删除了对象的所有引用,它应该被收集(添加一些东西作为事件监听器,算作创建引用,因为某个对象某处必须知道在哪里发送事件) – jusio 2012-04-23 16:22:56