如何处理Java EE中的内存泄漏?

时间:2011-07-19 05:49:19

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

当我在网上找到某个地方时,以下项目可能会导致内存泄漏。例如:

  • ResultSets和Statement对象
  • DataLists
  • 集合
  • 静态变量和类
  • 单身
  • HttpSession和HttpRequest

我的JSF应用程序中的托管bean大多是@ViewScoped,所以我认为离开视图后,GC有足够的信息来释放数据列表,对象等等。但它没有或没有完全:

enter image description here

我只是手动关闭hibernate会话(最后使用),但这就是全部。我从GC中得到的其他一些东西。

你能告诉我吗,

  • 如何找到哪些具体物体留在记忆中?
  • 手动离开视图后如何释放对象?像析构函数......?
  • 处理内存泄漏的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

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

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

探查器可帮助您将每个对象跟踪到原点。因此,您可以找出持有对非垃圾收集对象的引用的父对象。

提防:

  • 当您有一个已加载的java集合并完成后,请指定collectionObject=null。我们注意到,即使列表超出范围,在设置为null之前也没有收集垃圾。

  • 在循环中创建的对象。

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

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

  • 重载HTTP会话

答案 1 :(得分:1)

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

答案 2 :(得分:1)

首先,恕我直言,这不是真正的记忆泄漏。 GC不时发布memmory。也许你应该向我们展示更长时间的报告。也许......持有物品的时间太长了。要查看引用,您可以使用here之类的JProfiler。也可以尝试Eclipse Memory Analyzer自动报告。我想你应该试试tuning Garbage Collection。为了找到memmory泄漏,请查看此响应How to find a Java Memory Leak

答案 3 :(得分:1)

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