【问题标题】:What happens with references to window when we close it and how to prevent this memory leakage?当我们关闭它时对窗口的引用会发生什么以及如何防止这种内存泄漏?
【发布时间】:2015-02-25 18:34:33
【问题描述】:

我对防止长寿命 Java 应用程序中的内存泄漏问题感兴趣。因此,假设我们在某个服务器端应用程序中为每个用户创建一个窗口。我们有专门开发这个窗口的人。这个窗口的开发者在onClose() 做了一些事情,但是对这个窗口的引用仍然存在。这意味着如果该窗口的最终用户通过一些参考将一些 1MB 图像放入该窗口,那么对于 1000 个用户,我们将有 1GB 未释放内存。

在长寿命应用程序中防止这种内存泄漏的常用方法(可能是一些设计模式)是什么?

我正在阅读this article in JavaWorld,我发现它最终解决了与听众内部引用相关的问题。我不明白它与这个问题的联系。

我确实明白我们可以简单地创建一个外部侦听器,一旦它关闭,它就会将 null 放入对该窗口的所有引用中,但是我认为这不是最好的解决方案(例如,想想当有人创建引用时会发生什么并且忘记添加这样的侦听器!)。

【问题讨论】:

  • 我不确定在服务器端应用程序上创建窗口需要什么。通常这类问题要么通过确保您控制引用并在侦听器中杀死它们来解决,要么通过使用弱引用来解决。在这种特殊情况下,细节模糊,没有代码,没有更具体的答案。
  • 我们应该只依赖存储引用的人来创建侦听器吗?如果是这样,我真的希望有一天有人会开发一种设计模式来处理它。
  • 正如我所说,通常您编写 API 以便控制引用。如果没有更多信息,我们无法为您提供帮助。
  • 但是如何创建这样的API呢?也许我的观点是错误的,但就我而言 - 必须有一些人们通常用来处理它的设计模式。

标签: java design-patterns model-view-controller memory-leaks


【解决方案1】:

不确定您指的服务器上下文中的 Window 类型。但通常您需要确保不再有引用(即不要将其存储在会话对象中)。

除此之外,您还可以将 window.close() 方法设置为 null 所有字段。因此,如果对 Window 的引用没有及时清空,至少可以提前将内容进行垃圾收集。

在 MVC 中,您的控制器可能绑定到 (HTTP) 会话,因此您需要确保引用为空:

class Controller {
  Window window;
  void closeWindow() {
    window.close(); // drops image (optional)
    window = null;  // frees object reference
  }
}

【讨论】:

  • 感谢您愿意提供帮助,但这是我在上一段中所说的逐字逐句的封面。
  • 但要确定:我并不是说您应该使用可以删除引用的委托包装器。我是说客户端代码需要使引用为空(或删除包含引用的对象)。在 web 应用程序中,您通常没有问题,因为您仅在请求方法或会话中保存引用。
  • 哇,这评论很有帮助:-)。所以现在从上面的评论中对鲍里斯的 naswer 对我来说也很有意义。谢谢!
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 2021-08-15
  • 2016-01-01
  • 2013-06-14
  • 2018-06-08
  • 2013-09-20
  • 2011-05-13
  • 2015-10-14
相关资源
最近更新 更多