1

我有一个使用多选项卡方法的 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(参见附图)。

如何销毁关闭的窗口以防止内存泄漏?

从 <code>UriFragmentUtility</code> 到 GC 根的路径的 Eclipse MAT 屏幕截图,<code>DofApplication</code> 是 <code>com.vaadin.Application</code> 的实例

更新 我发现在代码窗口中只添加到 VaadinApplication并没有删除。添加后Application.removeWindow(),与刷新同一选项卡相关的任何内容都没有改变。

4

0 回答 0