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

我们只是在打开一个新窗口(JFrame)并关闭它。该框架包含一个EmptyPanel类(其中包含一条短消息,表明没有数据)和一个自定义JMeunBar类。我们根本不会与之互动-请立即关闭窗口。

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

在分析堆转储时,没有对JMenuBar进行垃圾回收。它已从GC根sun.awt.AppContext保持打开状态。

我们如何清理呢?还是我们不必出于某种原因而担心?我们要努力确保自己的应用程序在启动后自行清理,但我们也不想为此而烦恼。
AppContext.mainAppContext包含一个HashMap,其中包含一个BasicPopupMenuUI.MenuKeyboardHelper实例。内部是一个ComponentInputMapUIResource.menuInputMap,该JMenuBar作为组件。

最佳答案

here所述,有许多系统资源必须在JVM操作的正常过程中显式释放。图形上下文的 dispose() 方法就是一个示例。父窗口的 dispose() 方法是另一个。无论哪种方式,资源都可以正确释放,但是您可以在完成堆之前观察堆。

很难一概而论,可以安全地忽略什么,但是一种经验方法是在探查器中执行目标。此comparison中的前两个图显示了某种被怀疑保留了资源的方法所消耗的内存的微小但稳定的增加。相比之下,第三张图显示了平面内存使用情况以及垃圾回收 Activity 的周期性峰值。下面是视觉上“繁忙”程序(例如game)的典型锯齿模式。请注意,每个周期都返回基线。

10-01 00:27