当我在网上找到某个地方时,以下项目可能会导致内存泄漏。例如:
我的JSF应用程序中的托管bean大多是@ViewScoped
,所以我认为离开视图后,GC有足够的信息来释放数据列表,对象等等。但它没有或没有完全:
我只是手动关闭hibernate会话(最后使用),但这就是全部。我从GC中得到的其他一些东西。
你能告诉我吗,
答案 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。