gpt4 book ai didi

java - 为什么必须对超出范围的 java.awt.Window 进行 dispose()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:59 26 4
gpt4 key购买 nike

我在我们的应用程序中发现的内存泄漏之一是 java.awt.Window.allWindows 私有(private)静态字段,它跟踪每个实例化的 Window。我们有创建、使用然后被遗忘的对话框,并且期望这些对话框会消失并被垃圾收集。这个私有(private)字段将它们无限期地保留在范围内,直到对它们调用 dispose() 方法。根据定义,当它们超出范围时我们不能这样做。

我不明白为什么要这样设计。似乎有悖于垃圾回收的精神,必须明确地让系统知道我何时完成了 Window 对象。显然我已经完成了它,因为它超出了范围。

我明白 dispose() 方法在做什么:摆脱系统对等对象。我知道这是在 Java 之外,您需要一些方法来做到这一点,并且 Swing 不应该只是失去对这些对象的跟踪,否则它会发生内存泄漏。但是,当我永远不会再使用它时,通过永远保留对我的 Window 的引用来实现什么?

有人可以解释为什么这是必要的吗?

最佳答案

我不想这么说,但这就是 GUI 的工作方式。

Windows 是非阻塞的。这意味着一旦您在代码中创建了一个,您的代码就会继续执行。

这意味着您的 Window 可能在创建后立即超出范围,除非您在其他地方明确存储了对它的引用。此时窗口仍在屏幕上。

这也意味着您需要一些其他方法来在您完成处理后摆脱它。输入 Window dispose()方法,可以从 Window 的一个监听器中调用。

关于java - 为什么必须对超出范围的 java.awt.Window 进行 dispose()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1407161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com