当我使用文件或数据库连接等外部资源时,我需要先关闭它们才能让它们离开。
我是否需要使用Swing组件做同样的事情?如果是,那么如何?
答案 0 :(得分:5)
通常,在完成对象时不需要处理对象(尽管将对它们的引用设置为null可能允许它们更快地进行GC)。但是,AWT和Swing对象分配了一些需要释放的本机资源。此外,AWT线程将窗口视为顶级对象,防止它们被垃圾收集并阻止JVM终止。
因此,当您完成窗口后,您需要处理它,这将释放它已分配的本机资源。一种方法是在其上调用Window.dispose()。但是,更好的选择是在初始化每个根窗口时调用JFrame.setDefaultCloseOperation()。如果你传递它DISPOSE_ON_CLOSE,它会在用户关闭窗口时处理它自己。当最后一个这样的窗口关闭时,AWT线程将停止阻塞并允许JVM关闭(假设您没有运行任何其他异常线程)。或者,您可以传递它EXIT_ON_CLOSE,这将导致您的窗口调用System.exit(),它告诉JVM您的应用程序已完成并正常终止。
答案 1 :(得分:2)
有一次,它被告知你必须断开所有的监听器,因为否则它们将作为Swing组件的引用。但我被告知这不再是一个问题。
答案 2 :(得分:0)
如果没有引用对象,则会自动对其进行垃圾回收。您不必像处理外部资源那样处理Swing组件。但是,如果您有一个以后不需要的组件,则可以将对该组件的任何引用设置为null。
JPanel p = new JPanel();
p = null;
将p设置为null不会删除该对象,但会删除对该对象的任何引用,以便下次垃圾收集器通过时它会被拾取。
虽然不存在对该组件的其他引用,但您必须小心。
答案 3 :(得分:0)
应该处理Windows(包括对话框和框架)。如果你创建(AWT)Graphics
个对象,那么它们也应该被处理掉(但通常是在paintComponent
方法中的本地)。
如果你有一个监听器来从一个长期存在的源更新一个短期目标,那么你应该在丢弃目标之前删除它。听众使用WeakReference
到目标时会有一个简洁的黑客,这样它就可以在引用消失时取消注册(并触发一个事件)。