GXT HandlerManager总线内存泄漏

时间:2019-05-04 06:24:18

标签: javascript gwt gxt

我正在搜索GWT应用程序中的内存泄漏。我从Chrome开始创建堆转储,并在执行某些操作后对其进行比较。

在每个堆转储的摘要中,我可以看到,在处理了大量数组,Maps,HashMaps之后,最大的类组之一是HandlerManager.Bus类。每个HandlerManager.Bus项目都包含一些Map。他们每次累积在堆中的点击都不会被GC删除。

手动启动GC也无济于事。

进一步的阅读表明HandlerManager与ClickEvents和MouseEvents有关。我现在正在寻找这些事件和源代码,这些事件和源代码将它们连接到视图和网格字段以及其他gwt / gxt代码。

请给出一些提示,这些类通常会出错。

我假设存在一些静态类,并且永远不会丢失对此事件的引用,因此GC无法删除它们。

我无法像在MAT中一样容易地跟踪堆中的内存对象,这是非常糟糕的。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

我以前肯定见过这个问题。您会注意到,所有添加处理程序的调用都返回HandlerRegistration。将它们保存在列表中。当您完成了一个包含处理程序列表的类时,请遍历该列表并删除每个处理程序。自从我看过任何GWT / GXT以来已经有一段时间了,但是我认为它就像这样。

List<HandlerRegistration> handlerList = new LinkedList<>();

public void addListeners() {
    handlerList.add(myComboBox.addListener(mySelectionHandler));
}

public void onClose() {
    handlerList.forEach(handler -> handler.removeHandler());
}