java - GWT 对未使用的小部件进行垃圾收集?

标签 java javascript html gwt garbage-collection

我对以下示例中何时以及是否会触发 GWT 垃圾收集的问题感兴趣。

我有一个复合:

class A extends Composite implements HasClickHandlers {

  ...

  FocusPanel panel = new FocusPanel();

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return focusPanel.addClickHandler(handler);
    } 

}

在 View 类中,我创建此小部件,添加单击处理程序并将此小部件添加到面板:

A widget = new A();
widget.addClickHandler(someClickHandler);
somePanel.add(widget);

在应用程序中的某个时刻,我清除了输入小部件的面板。因此该小部件不再附加到 DOM,并且该小部件上没有引用指向。

void removeAll() {
   somePanel.clear();
}

小部件和点击处理程序会发生什么情况。 GWT 垃圾收集会处理这个问题吗?我是否必须自己保存处理程序注册并删除点击处理程序?

最佳答案

小部件系统的优点之一是它可以为您管理所有这些内存问题。假设您仅通过将小部件添加到其他小部件来组合小部件(并且从不使用 getElement().appendChild(...) 等),则所有处理程序在附加时都会自动连接到 dom,并且在它们附加时会自动取消连接已分离或页面已卸载。

这意味着您只需将小部件视为普通对象 - 如果它们不再附加到页面并且您不保留对它们的引用,则无论浏览器如何,它们都将被正确地垃圾收集。

您提到的特定内存泄漏仅是旧版浏览器中的问题 - 现代 Webkit/Gecko(Chrome/Safari/Opera 和 Firefox)没有这些问题,IE 10 或 11 也没有。

查看http://www.gwtproject.org/articles/dom_events_memory_leaks_and_you.html更深入地讨论 Widget 如何实现此内存泄漏预防代码。

关于java - GWT 对未使用的小部件进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591252/

相关文章:

java - 使用自动生成的主键提高数据库性能(或)避免数据库表的性能问题

javascript - 尝试学习并运行一个简单的 if-else-if 脚本,但没有得到结果

javascript - jQuery Instagram Bootstrap3 动态轮播

java - 在 Hibernate 3 上禁用透明持久化

java - JOOQ——嵌套查询

java - 在不违反 SOLID 原则的情况下使用具有不同方法名称的子类

javascript - 两个脚本出现 Jade 渲染错误,Uncaught SyntaxError : Unexpected token <

html - 背景颜色和边框半径之间的空白

html - 顶边距不起作用反而高度增加

jquery - 更改子元素悬停时的父元素背景位置