【问题标题】:Will "addValueChangeListener" cause memory leak?“addValueChangeListener”会导致内存泄漏吗?
【发布时间】:2014-12-08 07:09:57
【问题描述】:

我在左侧面板中使用树,在右侧面板中使用详细视图(带有标签和按钮的垂直布局)。每个节点都包含大量数据,以这种方式保存:

IndexedContainer nodeData;
.
.
.
tree.getContainerDataSource()
    .getContainerProperty(itemId, "nodeData").setValue(nodeData)

所选节点的内容显示在详细视图中。它可以使用模式窗口进行修改(在详细视图中单击“编辑”按钮)。

我正在使用 nodeData.addValueChangeListener(detailView)。详细视图实现了在模态窗口保存nodeData时更新自己的内容的功能。

它工作正常,但我担心内存泄漏。当我选择另一个节点时,右侧面板内容(detailView)被破坏。另一个视图可以放在同一个地方,因为另一个节点的nodeData可以有另一个结构。但是 nodeData 容器存在很长时间,我可以选择更多次。我的问题是:

会导致内存泄漏吗?或者系统能够删除仅作为侦听器引用的不可访问对象?

谢谢你告诉我,如果它可能是问题。任何建议表示赞赏。

【问题讨论】:

    标签: memory-leaks listener vaadin


    【解决方案1】:

    在这种情况下我不会担心内存泄漏,因为监听器被注入到组件中。 您可以从服务器检测是否存在内存泄漏,例如,如果存在内存泄漏或任何无法访问的对象,则停止 Tomcat 服务器将通过日志中的一些内存泄漏错误。

    但是,我建议您覆盖树上的 detach() 方法,以确保在视图或组件与屏幕/视图分离后清理资源。

    【讨论】:

    • 不幸的是内存泄漏存在。 F.e.我需要刷新我的标签:nodeData.addValueChangeListener(myLabel);即使布局不存在,标签(在布局中)函数 valueChanged(event) 也会被触发。
    【解决方案2】:

    问题解决了。当组件处于孤立状态时,可以从侦听更改中检出组件:

    if(!isAttached()) 
       nodeData.removeValueChangeListener(this);
    

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2011-06-16
      • 2011-10-28
      • 1970-01-01
      相关资源
      最近更新 更多