Java 在让Swing组件回收垃圾之前,我需要释放它们吗?

Java 在让Swing组件回收垃圾之前,我需要释放它们吗?,java,swing,Java,Swing,如果我使用外部资源,如文件或数据库连接,我需要在释放它们之前关闭它们 我是否需要对Swing组件执行相同的操作?如果是,那么如果没有对对象的引用,如何自动对对象进行垃圾收集。您不必像对待外部资源那样对待Swing组件。但是,如果您有一个以后不需要的组件,则可以将对该组件的任何引用设置为null JPanel p = new JPanel(); p = null; 将p设置为null不会删除该对象,但会删除对该对象的任何引用,以便下次垃圾收集器通过时将其拾取 尽管对该组件的其他引用不存在,但您必

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


我是否需要对Swing组件执行相同的操作?如果是,那么如果没有对对象的引用,如何自动对对象进行垃圾收集。您不必像对待外部资源那样对待Swing组件。但是,如果您有一个以后不需要的组件,则可以将对该组件的任何引用设置为null

JPanel p = new JPanel();
p = null;
将p设置为null不会删除该对象,但会删除对该对象的任何引用,以便下次垃圾收集器通过时将其拾取


尽管对该组件的其他引用不存在,但您必须小心。

有一次,您被告知必须断开所有侦听器的连接,否则它们将充当对Swing组件的引用。但是我被告知这不再是一个问题。

通常情况下,处理完对象后不需要处理它们(尽管将对它们的引用设置为null可能会允许更快地对它们进行GCed)。但是,AWT和Swing对象分配了一些需要释放的本机资源。此外,AWT线程将窗口视为顶级对象,防止它们被垃圾收集和JVM终止

因此,当您使用完窗口后,您需要将其丢弃,这将释放它已分配的本机资源。一种方法是对其调用()。但是,更好的选择是在初始化每个根窗口时调用()。如果将其传递给DISPOSE\u ON\u CLOSE,则当用户关闭窗口时,它将自行处理。当最后一个窗口关闭时,AWT线程将停止阻塞并允许JVM关闭(假设您没有任何其他异常线程运行)。或者,您可以在关闭时将其传递给EXIT,这将导致您的窗口调用System.EXIT(),这将告诉JVM您的应用程序已完成并正常终止。

应该释放窗口(包括对话框和框架)。如果您创建(AWT)
图形
对象,那么它们也应该被处理掉(但通常在
paintComponent
方法中进行局部处理)


如果您有一个监听器从一个长期源更新一个短期目标,那么您应该在丢弃该目标之前删除它。有一种巧妙的方法,侦听器对目标使用
WeakReference
,以便在引用消失(并触发事件)时取消注册。

p=null很少需要。看到了吗?但是swing组件使用外部资源(例如窗口句柄),它们呢?如果我只去掉一些JPanel控件来放置其他控件呢?不关闭整个窗口。然后呢?OP有一个未回答的评论,我也想知道。JPanel需要清理吗?视情况而定。如果您的组件与您注册侦听器的组件同时死亡或在该组件之后持续死亡,则不需要任何特殊的东西,一个无法访问的引用循环将自动GC'd。但是,如果您的组件可能被关闭/丢弃,而您侦听的组件或服务仍然处于活动状态,那么您的侦听器将成为内存泄漏,并可能阻止来自该侦听器的活动引用对视图、模型和任何其他对象进行GC。将侦听器注销到比您自己的生命周期更长的服务或组件非常重要。