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

Java 未使用小部件上的GWT垃圾收集?,java,javascript,html,gwt,garbage-collection,Java,Javascript,Html,Gwt,Garbage Collection,我感兴趣的问题是,在下面的示例中,GWT垃圾收集何时以及是否会被触发 我有一份综合报告: class A extends Composite implements HasClickHandlers { ... FocusPanel panel = new FocusPanel(); @Override public HandlerRegistration addClickHandler(ClickHandler handler) { return f

我感兴趣的问题是,在下面的示例中,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垃圾回收会处理它吗?我是否必须保存处理程序注册并自己删除点击处理程序?

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

这意味着您只需像对待普通对象一样对待小部件-如果它们不再附加到页面上,并且您不持有对它们的引用,那么无论浏览器如何,它们都将被正确地垃圾收集

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

查看关于小部件如何实现此内存泄漏预防代码的更深入讨论