【问题标题】:How to handle memory leaks in Java EE?如何处理 Java EE 中的内存泄漏?
【发布时间】:2011-10-08 05:43:52
【问题描述】:

正如我在网上某处发现的那样,以下项目可能会导致内存泄漏。例如:

  • ResultSet 和 Statement 对象
  • 数据列表
  • 收藏
  • 静态变量和类
  • 单身人士
  • HttpSession 和 HttpRequest

我的JSF应用中托管的bean大多是@ViewScoped,所以我认为离开视图后GC有足够的信息来释放datalists、objects等。但它没有或不完全:

我只是手动关闭休眠会话(使用 finally),仅此而已。我对 GC 的其他期望。

你能告诉我吗,

  • 如何找到哪些具体对象留在内存中?
  • 手动离开视图后如何释放对象?类似于析构函数..?
  • 处理内存泄漏的最佳实践是什么?

【问题讨论】:

  • JHat, MAT (eclipse.org/mat) 可能会有所帮助。甚至,JConsole 提供了关于内存泄漏的足够线索——或者至少是什么占用了你的所有 RAM。
  • 谢谢你,Nishant,我会试试 MAT :)
  • MAT 对我帮助很大,如果你愿意,请给出答案,我会接受的 :)

标签: jakarta-ee memory-leaks garbage-collection profiling


【解决方案1】:

在我们的项目中,我们使用了 yourkit (http://www.yourkit.com/eap/index.jsp) 分析器。我发现用户界面非常友好。

您可以连接到您的 Web 应用程序并了解对象的增长情况以及增长率如何。

分析器可帮助您将每个对象追溯到原点。因此,您可以找出持有对非垃圾收集对象的引用的父对象。

注意:

  • 当你有一个加载的 java 集合并完成它时,分配 collectionObject=null 。我们注意到,即使列表超出了范围,它也不会被垃圾收集,直到它被设置为 null。

  • 在循环中创建对象。

  • 跨类引用的对象。这些对象倾向于留在系统中,直到所有引用都被释放。

  • 字符串连接(String a = b+s)非常昂贵!

  • 重载 HTTP 会话

【讨论】:

  • 非常感谢,拉克希米!
【解决方案2】:

JHat,Eclipse MAT 可能会有所帮助。甚至,JConsole 提供了关于内存泄漏的足够线索——或者至少是什么占用了你的所有 RAM。

【讨论】:

    【解决方案3】:

    您应该使用一种可用的 java 分析器。有很多。所有分析器都允许存储快照和比较快照。因此,您应该在开始时存储快照,然后使用您的应用程序执行一些场景,然后再次存储快照并进行比较。您将获得所有不能被 GC 删除的对象及其引用。然后尝试分析谁持有对这些对象的引用以及如何修复错误。

    【讨论】:

    • 谢谢你,AlexR,我正在做类似的事情,MAT 告诉我,我的问题未发布org.hibernate.impl.SessionFactoryImpl @ 0x3f026c0 - 652 664 (1,24%) bytes。我必须找到如何使用会话工厂
    【解决方案4】:

    首先恕我直言,这不是真正的内存泄漏。 GC 不时释放内存。也许你应该向我们展示更长的时间报告。也许某物持有的时间过长。要查看参考资料,您可以使用 JProfiler,例如 here。也可以试试Eclipse Memory Analyzer 自动报告。我认为你应该试试tuning Garbage Collection。要查找内存泄漏,请查看此回复 How to find a Java Memory Leak

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2017-08-11
      相关资源
      最近更新 更多