加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么你必须处理()一个超出范围的java.awt.Window?

发布时间:2020-12-14 06:00:55 所属栏目:Java 来源:网络整理
导读:我在应用程序中发现的内存泄漏之一是 java.awt.Window.all Windows专用静态字段,它会跟踪每个实例化的窗口.我们有创建,使用,然后被遗忘的对话框,并且期望的是这些对话框将会消失,被垃圾回收.这个私有字段保持范围,无限期地,直到调用了dispose()方法.根据定义
我在应用程序中发现的内存泄漏之一是 java.awt.Window.all Windows专用静态字段,它会跟踪每个实例化的窗口.我们有创建,使用,然后被遗忘的对话框,并且期望的是这些对话框将会消失,被垃圾回收.这个私有字段保持范围,无限期地,直到调用了dispose()方法.根据定义,当我们超出范围时,我们不能这样做.

我不明白为什么这是这样设计的.这似乎与垃圾收集的精神相反,必须明确让系统知道什么时候我完成了一个Window对象.显然我完成了它,因为它超出了范围.

我明白dispose()方法在做什么:摆脱系统对等体对象.我明白这是Java之外的,你需要一些方法来做到这一点,而且Swing不应该只是失去对这些对象的跟踪,否则会有内存泄漏.但是,当我永远不会再使用它时,通过保持对我的窗口的引用来实现什么呢?

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

解决方法

我讨厌说,但这只是GUI的工作原理.

Windows是非阻塞的.意思是一旦你在代码中创建一个代码,你的代码就会继续执行.

这意味着您的窗口可能会在创建后立即超出范围,除非您明确地将引用存储在其他位置.此时窗口仍在屏幕上.

这也意味着你需要一些其他的方式来摆脱它,当你完成它.输入Window dispose()方法,可以从Window的一个侦听器中调用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读