1

I have a Vaadin application that uses multitab approach. Application.getWindow(String name) is overriden in the manner that if super.getWindow(name) is not found, it creates and adds a new window to an application . All windows have Window.CloseListener's which print message to output. Also I see moments of creation and destroying of windows - constructor and finalize() both print messages to console too.

When I refresh same browser tab a new window is created and I see Window.CloseListener's message in console and none of messages from finalize() methods. If I add a singleton AtomicLong which counts instances (add in constructor, dec in finalize()), I see growing number of instances (on those refreshes) which is not decrementing with time.

It seems like Vaadin stores closed windows somehow. I also jmap'ed an application and opened heap file in Eclipse MAT. MAT shows that one of components of closed window, UriFragmentUtility, is referenced with a chain: Application -> WebApplicationContext -> CommuncationManager -> (through paintableMap) UriFragmentUtility (see image attached).

How can I destroy closed windows to prevent memory leaks?

Eclipse MAT screenshot of path from <code>UriFragmentUtility</code> to GC roots, <code>DofApplication</code> is instance of <code>com.vaadin.Application</code>

Update I have found that in the code windows are only added to Vaadin Application and are not deleted. After adding Application.removeWindow() nothing has changed related to refreshing same tab.

Askar Kalykov
  • 2,553
  • 1
  • 22
  • 43

0 Answers0