我对以下示例中何时以及是否将触发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垃圾收集是否能够解决这个问题?我是否必须保存处理程序注册并自行删除单击处理程序?
答案 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如何实现此内存泄漏防护代码。