未使用的小部件上的GWT垃圾收集?

时间:2014-02-05 23:58:01

标签: 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);
    } 

}

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

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

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

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

小部件和点击处理程序会发生什么。 GWT垃圾收集是否能够解决这个问题?我是否必须保存处理程序注册并自行删除单击处理程序?

1 个答案:

答案 0 :(得分:3)

小部件系统的一个优点是它可以为您管理所有这些内存问题。如果你只是通过将小部件添加到其他小部件来组合小部件(并且从不使用getElement()。appendChild(...)等),所有处理程序将在连接时自动连接到dom,并且当它们是分离或页面被卸载。

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

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

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