我有一个使用multitab方法的Vaadin应用程序。如果未找到Application.getWindow(String name)
,则会覆盖super.getWindow(name)
,它会为应用程序创建并添加新窗口。所有窗口都有Window.CloseListener
个要输出的打印消息。此外,我看到了创建和破坏Windows的时刻 - 构造函数和finalize()
也将打印消息打印到控制台。
当我刷新相同的浏览器选项卡时,会创建一个新窗口,我在控制台中看到Window.CloseListener
的消息,而没有来自finalize()
方法的消息。如果我添加一个单例AtomicLong来计算实例(在finalize()
中添加构造函数,dec),我会看到越来越多的实例(在那些刷新上)并没有随着时间的推移而减少。
似乎Vaadin以某种方式存储关闭的窗口。我还jmap
编了一个应用程序并在Eclipse MAT中打开了堆文件。 MAT表示闭合窗口UriFragmentUtility
的一个组件用链引用:Application
- > WebApplicationContext
- > CommuncationManager
- > (通过paintableMap)UriFragmentUtility
(见附图)。
如何销毁关闭的窗口以防止内存泄漏?
更新
我发现在代码窗口中只添加到Vaadin Application
并且不会被删除。添加Application.removeWindow()
后,没有任何更改与刷新相同标签相关。