English 中文(简体)
我需要在允许它们被垃圾回收之前释放Swing组件吗?
原标题:
  • 时间:2008-11-26 13:23:58
  •  标签:

当我使用外部资源例如文件或数据库连接时,我需要在释放它们之前关闭它们。

我需要对Swing组件做同样的事情吗? 如果是,则如何?

最佳回答

通常情况下,当您完成使用时,不需要丢弃对象(尽管将对它们的引用设置为 null 可能会更早地使它们被清理)。但是,AWT 和 Swing 对象分配了一定量的本地资源需要被释放。此外,AWT 线程将窗口视为顶级对象,防止它们被垃圾收集和 JVM 终止。

因此,当您完成窗口后,您需要处理它,这将释放其分配的本地资源。一种处理方式是在其上调用Window.dispose()。然而,更好的选择是在初始化每个根窗口时调用JFrame.setDefaultCloseOperation()。如果传递DISPOSE_ON_CLOSE,关闭窗口时它将自行处理处理。当最后一个此类窗口关闭时,AWT线程将停止阻止并允许JVM关闭(假定您没有运行其他异常线程)。或者,您可以传递EXIT_ON_CLOSE,这会导致您的窗口调用System.exit(),告诉JVM您的应用程序已完成并优雅地终止。

问题回答

曾经有一种观点认为你必须要断开所有的监听器,否则它们会作为对Swing组件的引用。但是我被告知这已经不是问题了。

如果没有引用,对象将自动进行垃圾回收。您不必像处理外部资源那样处理Swing组件。但是,如果您有一个组件将来不需要,您可以将该组件的任何引用设置为空。

JPanel p = new JPanel();
p = null;

将p设置为null不会删除对象,但会删除对该对象的任何引用,因此下次垃圾回收器通过时会将其选取。

但是你必须小心,确保其他关于该组件的引用不存在。

窗口(包括对话框和框架)应当被处理。如果你创建了(AWT)Graphics对象,那么它们也应该被处理(但通常是在本地的paintComponent方法中)。

如果您有一个侦听器来更新短期目标以从长期源中获得,则应在丢弃该目标之前将其删除。有一个巧妙的方法,其中侦听器使用对目标的弱引用,以便在引用消失(并触发事件)时取消注册。 (请注意,此翻译可能因上下文而异。)





相关问题
热门标签