如何让AppContext释放AWT组件以便它们可以被垃圾回收?

我的团队正在分析我们的Swing应用程序,以确保在不再使用时收集所有内容。 我们遇到了一个奇怪的问题。

我们只是打开一个新窗口( JFrame )并关闭它。 此框架包含EmptyPanel类(其中包含一条说明没有数据的短消息)和一个自定义JMeunBar类。 我们根本不与此互动 – 只需立即关闭窗口。

然后,我们强制进行垃圾收集并进行堆转储。

在分析堆转储时, JMenuBar不会被垃圾回收。 它从GC Root sun.awt.AppContext保持打开sun.awt.AppContext

我们如何清理它? 或者这是我们不必为某些原因而担心的事情? 我们想要努力确保我们的应用程序自行清理,但我们也不想在这上面转动。

AppContext.mainAppContext包含一个包含BasicPopupMenuUI.MenuKeyboardHelper实例的HashMap。 其中包含一个ComponentInputMapUIResource.menuInputMap ,它将此JMenuBar作为组件。

如此处所讨论的,在JVM操作的正常过程中必须明确释放许多系统资源。 图形上下文的dispose()方法就是一个例子; 父窗口的dispose()方法是另一种方法。 在任何一种情况下,资源都可以正确释放,但您可以在最终确定之前观察堆。

关于可以安全忽略的内容很难概括,但一种经验方法是在分析器中实现目标。 此比较中的前两个图表显示某种怀疑保留资源的方法消耗的内存小但稳定增加。 相比之下,第三个图表显示了平面内存使用以及垃圾收集活动的周期性峰值。 下面是一个典型的锯齿形图案的视觉“忙”程序,如这个游戏 。 请注意,每个循环都会返回基线。

在此处输入图像描述