Jakarta ee 如何处理JavaEE中的内存泄漏?

Jakarta ee 如何处理JavaEE中的内存泄漏?,jakarta-ee,memory-leaks,garbage-collection,profiling,Jakarta Ee,Memory Leaks,Garbage Collection,Profiling,正如我在网上发现的,以下项目可能导致内存泄漏。例如: 结果集和语句对象 数据表 收藏 静态变量和类 单身汉 HttpSession和HttpRequest 我的JSF应用程序中的托管bean大多是@viewscope,因此我认为在离开视图之后,GC有足够的信息来发布数据列表、对象等等。但它没有或不完全: 我只是手动关闭hibernate会话(使用finally),但仅此而已。我对GC的其他期望 你能告诉我 如何找到哪些具体的对象留在记忆中 手动离开视图后如何释放对象?类似于析构函数的东西

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

  • 结果集和语句对象
  • 数据表
  • 收藏
  • 静态变量和类
  • 单身汉
  • HttpSession和HttpRequest
我的JSF应用程序中的托管bean大多是
@viewscope
,因此我认为在离开视图之后,GC有足够的信息来发布数据列表、对象等等。但它没有或不完全:

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

你能告诉我

  • 如何找到哪些具体的对象留在记忆中
  • 手动离开视图后如何释放对象?类似于析构函数的东西
  • 处理内存泄漏的最佳实践是什么
您应该使用一个可用的java分析器。有很多。所有探查器都允许存储快照和比较快照。所以,您应该在开始时存储快照,然后对应用程序执行一些场景,然后再次存储快照并进行比较。您将获得GC无法删除的所有对象及其引用。然后试着分析谁持有这些对象的引用,以及如何修复错误。

首先,这不是真正的内存泄漏。GC不时发布memmory。也许你应该给我们看更长时间的报告。也许某物放东西的时间太长了。要查看引用,可以使用类似JProfiler的工具。也可以尝试自动报告。我想你应该试试。要查找memmory泄漏,请查看此响应

在我们的项目中,我们使用了yourkit()探查器。我发现用户界面非常友好

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

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

注意:

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

  • 在循环中创建的对象

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

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

  • 重载HTTP会话


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

      JHat,MAT()可能会有帮助。甚至,JConsole提供了足够多的关于内存泄漏的线索——或者至少是什么占用了你所有的内存。谢谢你,Nishant,我会试试MAT:)MAT帮了我很大的忙,如果你愿意,我会接受的:)谢谢你,AlexR,我也在做类似的事情,MAT告诉我,我的问题是未发布的
      org.hibernate.impl.SessionFactoryImpl@0x3f026c0-652 664(1,24%)字节
      。我必须找到如何使用session Factory非常感谢你,拉克希米!