我有一个使用多选项卡方法的 Vaadin 应用程序。以如果未找到Application.getWindow(String name)
的方式被覆盖,它会创建一个新窗口并将其添加到应用程序。super.getWindow(name)
所有窗口都有Window.CloseListener
要输出的打印消息。我还看到了创建和销毁窗口的时刻 - 构造函数,并且finalize()
两者都将消息打印到控制台。
当我刷新同一个浏览器选项卡时,会创建一个新窗口,并且我Window.CloseListener
在控制台中看到 ' 消息并且没有来自finalize()
方法的消息。如果我添加一个对实例进行计数的单例 AtomicLong(在构造函数中添加, dec in finalize()
),我会看到实例数量不断增加(在那些刷新时),并且不会随时间减少。
似乎 Vaadin 商店以某种方式关闭了窗户。我还jmap
编写了一个应用程序并在 Eclipse MAT 中打开了堆文件。MAT 显示关闭窗口的组件之一UriFragmentUtility
用链引用:Application
-> WebApplicationContext
-> CommuncationManager
->(通过paintableMap)UriFragmentUtility
(参见附图)。
如何销毁关闭的窗口以防止内存泄漏?
更新
我发现在代码窗口中只添加到 VaadinApplication
并没有删除。添加后Application.removeWindow()
,与刷新同一选项卡相关的任何内容都没有改变。