2012-04-23 127 views
6

我创建一个新的主持人,像这样:GWT垃圾收集

new MyPresenter(new MyView()); 

它注册了一些事件处理程序和绑定到视图和这样。最终,我可能会“关闭”该视图,以便它不再由浏览器呈现。我并没有在任何地方保留对这个MyPresenter这个实例的引用。

在关于此主题的Google论坛中,常规回答是“将您的引用设置为null”,然后不必担心。与JavaScript不同,我不能只用Java中的this = null;来说明原因。但在Javascript中,很容易清空我知道不再使用的对象引用。

我的问题:我怎么知道这个主持人是否被垃圾收集,因为我没有保留对它的引用?它非常清楚地存在。我应该相信GWT和JS会照顾这个吗?或者我需要维护自己对MyPresenter的引用,以便我可以在完成后手动执行null

+0

这取决于浏览器。基本上,如果你没有对象的引用,它将被收集,但有bug,像IE中的着名的错误,DOM和JS对象之间的交叉引用(GWT中的默认组件通常被保护),或一些垃圾收集器无法删除对象岛。由于有很多浏览器,所以没有通用的技巧或工具来解决这个问题。唯一的选择是运行性能测试,并检查内存使用情况。 – jusio 2012-04-23 15:51:19

+0

我不**曾经从我的(用户)代码中引用该对象,但它可以存在,因为它可以处理事件,如果我将它们解雇。但是,如果我删除这些事件处理程序并将'MyView'清空足以导致GC'd?我的恐惧是,事实并非如此。 – 2012-04-23 16:04:44

+0

@TravisWebb它*应该*足够。但是意外发生了。我无法评论所有与GC有关的bug,但它们发生在时间之后。如果你删除了对象的所有引用,它应该被收集(添加一些东西作为事件监听器,算作创建引用,因为某个对象某处必须知道在哪里发送事件) – jusio 2012-04-23 16:22:56

回答

2

有两种类型的内存泄漏:

  • DOM /浏览器级别内存泄漏
  • 应用程序的内存泄漏。

在关闭应用程序后,DOM /浏览器级内存泄漏通常会持续。 AFAIK只有旧的浏览器(IE6)受到影响,这就是GWT使用special way附加处理程序的原因。
这对现代浏览器来说应该不是问题,至少在关闭应用程序时它们不会成为问题。但它们可能会变成应用程序内存泄漏。 (有关更多详细信息,请参见here)。但总的来说,现代的Javascript GC在释放未使用的内存方面相当不错。

应用程序内存泄漏可能是长时间运行的应用程序以及动态创建大量视图/演示者并通过事件处理程序保持引用的问题。但这在很大程度上取决于相关方的范围。
post是一个很好的参考资料,一些更多的信息。

最后为了确保您确实没有任何应用程序内存泄漏,您应该使用Dev Tools Heap Profiler来检查较长时间的内存消耗。
blog post有一些更多的信息。