“addValueChangeListener”会导致内存泄漏吗?

时间:2014-10-13 16:33:28

标签: memory-leaks listener vaadin

我在左侧面板中使用了一棵树,在右侧面板中使用了详细视图(带有标签和按钮的VerticalLayout)。每个节点都包含大量数据,这些数据通过以下方式保存:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

问题解决了。当它成为孤儿时,可以从监听更改中检出该组件:

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