【问题标题】:GWT Garbage CollectionGWT 垃圾收集
【发布时间】: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


【解决方案1】:

内存泄漏有两种:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多