我对以下示例中何时以及是否会触发 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/