2011-07-19 110 views
2

正如我在网上发现的,以下项目可能导致内存泄漏。例如:如何处理Java EE中的内存泄漏?

  • 的ResultSet和Statement对象
  • DataLists
  • 集合
  • 静态变量和类
  • 单身
  • 的HttpSession和HttpRequest的在我的JSF应用程序

托管bean大多是@ViewScoped,所以我认为在离开视图后,GC有足够的信息来释放数据主义者,对象等等。但它并没有或不completelly:

enter image description here

我只是手动关闭休眠会议(最后使用),但仅此而已。我从GC期望的其他事情。

你能告诉我,

  • 如何找到其具体的对象是住在内存?
  • 如何在手动离开视图后释放对象?像析构函数..?
  • 处理内存泄漏的最佳做法是什么?
+0

JHat,MAT(http://www.eclipse.org/mat/)可能会有帮助。甚至,JConsole也提供了关于内存泄露的足够线索 - 或者至少是什么让你的内存占用很大。 – Nishant

+0

谢谢你,Nishant,我会试试MAT :) – gaffcz

+0

MAT非常帮助我,做出答案,如果你愿意,我会接受它:) – gaffcz

回答

1

与jHat,Eclipse MAT会有所帮助。甚至,JConsole也提供了关于内存泄露的足够线索 - 或者至少是什么让你的内存占用很大。

1

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

+0

谢谢AlexR,我正在做类似的事情,MAT告诉我,我的问题是未发布'org.hibernate.impl.SessionFactoryImpl @ 0x3f026c0 - 652 664(1,24%)字节'。我必须找到如何使用会话工厂 – gaffcz

2

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

您可以连接到您的Web应用程序,找出对象增长以及增长率。

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

当心:

  • 当你有一个加载Java集合,并用它来完成的,分配collectionObject=null。我们注意到,尽管列表超出了范围,但直到它被设置为空时才收集垃圾。

  • 正在循环中创建的对象。

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

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

  • 重载HTTP会话

+0

非常感谢Lakshmi! – gaffcz