其中的内存泄漏我在我们的应用程序发现的是java.awt.Window.allWindows
私有静态字段,跟踪每一个的Window
实例化。 我们有创建,使用,然后被遗忘的对话框,并期望是,这些将消失,被垃圾收集。 这家私人领域使他们在范围上,无限期,直到dispose()
方法被调用它们。 根据定义,我们不能做到这一点时,他们已经超出范围。
我不明白这是为什么这样设计的。 这似乎违背了垃圾收集的精神,必须明确地让系统知道,当我用做Window
对象。 很显然,我用它做,因为它是超出范围。
我明白了dispose()
方法做:摆脱系统对对象。 我不明白,这是Java之外,你需要一些方法来做到这一点,那摇摆不应该只是失去这些对象的跟踪,否则将有内存泄漏。 但是通过保持我的一个参考实现Window
撒手人寰,当我再也不会使用它吗?
有人可以解释为什么这是必要的吗?
我讨厌这样说,但是这是一个GUI是如何工作的。
Windows是无阻塞。 这意味着一旦你在代码中创建一个,你的代码会继续执行。
这意味着你的窗口可能超出范围创建后立即启动,除非你明确地存储对它的引用别的地方。 该窗口仍然在屏幕上,在这一点上。
这也意味着你需要一些其他的方式来摆脱它,当你用它做。 输入Window dispose()
方法,可以从窗口的听众之一中被调用。
这也许可以解释它: AWT线程问题
简单地说,有很多更在JVM不仅仅是有形成分在进行中,后台线程等等。 这些线程和其他资源保持到JVM上最后一个窗口已被释放,然后将它们整理好,然后JVM可以退出干净。 因此,您使用的每个窗口,框架和对话窗口基本上持有锁在JVM上,以防止其退出,你必须通过调用手动管理这dispose()
。
我同意这是一个有点开溜的。 我已经运行相抵触的这几次自己。
在Java中,当你有本地代码(这是这些窗口部件的同龄人),你需要保持一个参考,以防止垃圾回收器试图垃圾收集的对象,而本地指针仍然存在,这将导致所有各种不良的东西(VM崩溃等)。
见,例如,讨论在这里 。
的dispose()
方法破坏由保持的物体WindowEvent
对象。 它不会杀死应用/程序。