代码之家  ›  专栏  ›  技术社区  ›  Hasan Tuncay

GXT HandlerManager总线内存泄漏

  •  0
  • Hasan Tuncay  · 技术社区  · 7 年前

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

    在每个堆转储的摘要中,我可以看到在大量数组、映射、哈希映射之后,最大的类组之一是HandlerManager.Bus类。每个HandlerManager.Bus项都包含一些映射。它们在堆中累积的每次单击都不会被GC删除。

    手动启动GC也没有帮助。

    进一步的阅读显示HandlerManager与ClickEvents和MouseEvents有关。我现在正在寻找那些事件和源代码,它们与视图、网格和其他gwt/gxt代码的字段相连接。

    请给出一些提示,这些类通常会出现什么问题。

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

    很遗憾,我不能像在MAT中那样简单地跟踪堆中的内存对象。

    谢谢你的建议。

    0 回复  |  直到 7 年前
        1
  •  0
  •   Bakon Jarser    7 年前

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

    List<HandlerRegistration> handlerList = new LinkedList<>();
    
    public void addListeners() {
        handlerList.add(myComboBox.addListener(mySelectionHandler));
    }
    
    public void onClose() {
        handlerList.forEach(handler -> handler.removeHandler());
    }
    
    推荐文章