java如何让AppContext发布AWT组件,以便对其进行垃圾收集?
我的团队正在分析我们的Swing应用程序,以确保当它不再被使用时,所有东西都被垃圾收集。我们遇到了一个奇怪的问题
我们只是打开一个新窗口(JFrame
)并关闭它。这个框架包含一个EmptyPanel
类(其中包含一条表示没有数据的短消息)和一个自定义JMeunBar
类。我们根本不与此互动——只需立即关闭窗口
然后,我们强制进行垃圾收集并进行堆转储
对堆转储进行分析后,JMenuBar
没有被垃圾收集。它从GC根目录保持打开状态sun.awt.AppContext
我们该怎么清理?还是出于某种原因我们不必担心?我们希望勤勉地确保应用程序在运行后进行清理,但我们也不想在这方面自生自灭
AppContext.mainAppContext
包含一个HashMap,其中包含一个BasicPopupMenuUI.MenuKeyboardHelper
实例。在这里面是一个ComponentInputMapUIResource.menuInputMap
,它有这个JMenuBar
作为一个组件
# 1 楼答案
如前所述here在JVM的正常操作过程中,必须显式释放许多系统资源。图形上下文的^{} 方法就是一个例子;父窗口的^{} 方法是另一种。在这两种情况下,资源都可能被正确释放,但您可以在堆最终确定之前观察它
很难概括什么是可以安全忽略的,但一种经验性方法是在探查器中执行目标。这个comparison中的前两个图显示了被怀疑保留资源的某个方法消耗的内存的少量但稳定的增加。相比之下,第三个图表显示了内存使用的平稳性和垃圾收集活动的周期性峰值。下面是一个典型的锯齿形的视觉“忙碌”程序,比如这个game。请注意,每个循环都会返回到基线