我的团队正在分析我们的Swing应用程序,以确保在不再使用时,所有内容都被垃圾收集。我们遇到了一个奇怪的问题。
我们只是打开一个新窗口(JFrame
)并关闭它。此框架包含EmptyPanel
类(其中包含一条说明没有数据的短消息)和一个自定义JMeunBar
类。我们根本不与此互动 - 只需立即关闭窗口。
然后,我们强制进行垃圾收集并进行堆转储。
在分析堆转储时,JMenuBar
未被垃圾回收。它从GC根sun.awt.AppContext
开始保持打开状态。
我们如何清理它?或者这是我们不必为某些原因而担心的事情?我们想要努力确保我们的应用程序自行清理,但我们也不想在这上面转动。
AppContext.mainAppContext
包含一个包含BasicPopupMenuUI.MenuKeyboardHelper
实例的HashMap。其中有一个ComponentInputMapUIResource.menuInputMap
,其JMenuBar
作为组件。
答案 0 :(得分:4)
正如所讨论的here,在JVM操作的正常过程中必须明确释放许多系统资源。图形上下文的dispose()
方法就是一个例子;父窗口的dispose()
方法是另一种方法。在任何一种情况下,资源都可以正确释放,但您可以在最终确定之前观察堆。
很难概括出可以安全忽略的内容,但一种经验方法是在分析器中实现目标。此comparison中的前两个图表显示某个怀疑保留资源的方法消耗的内存小但稳定增长。相比之下,第三个图表显示了平面内存使用以及垃圾收集活动的周期性峰值。以下是视觉上“繁忙”程序的典型锯齿形图案,例如game。请注意,每个循环都会返回基线。