java - 由于 org.hibernate.internal.SessionFactoryImpl 可能导致内存泄漏

标签 java hibernate memory-leaks out-of-memory

我已经用 Java 制作了 MVC webapp,但是当我每天运行一次时,由于内存错误,它再次关闭。

这个错误是这样的: 线程“http-apr-12136-exec-42”中的异常 java.lang.OutOfMemoryError:Java 堆空间

java.sql.SQLException: java.lang.OutOfMemoryError: Java 堆空间

我有包含崩溃统计信息的 hprof,其中具体说明了内存的使用情况。如果我使用 Eclipse Memory Analizer 打开 hprof,我会得到以下结果:

在 rar 中:https://mega.co.nz/#!Ht41xJDJ!MooePBSv5yOYSNN5OuvF7Afn2rcN-KJ2tXGSsgqtsaI

或在文件夹中:https://mega.co.nz/#F!6hJUyKbQ!D_Kb23E3KfAJqcd5EeAt0A

在概览报告中,我有这张图片 (OverviewEMA.JPG): 我不知道这张图说的是什么...我不明白。

在第二个选项卡中,默认报告,我有这个图形 (DefaulReport_EMA.JPG): 它说问题可能是“org.hibernate.internal.SessionFactoryImpl”的一个实例。但我不知道如何解决该实例。

在下一个选项卡中。在支配树中,再次出现前一个实例,它使用大约 42MB 的内存(与第一个图形相同)。图片为DominatorTree_EMA.JPG

如果我展开第一个类(出现问题的类),我有这个图形 (DominatorTreeExpanded_EMA.JPG):

在下一个选项卡中,在直方图中,图形是这样的 (Histogram_EMA.JPG):

而在 Unreachable 对象中,结果是这样的 (UnreachableObjects_EMA.JPG):

最后两张图我不是很明白

最后,我还有 Java VisualVM 的报告,其中我有这样的结果 (Heapdump_JVM.JPG):

根据这张图,除了 Integer 和 String 对象之外,HashMap 对象也是问题所在。 Hashmap 对象我认为是类发送到 jsp 文件的模型的对象,它从 JPA 对象(Hibernate 的对象)出发,所以问题可能是这样的,但我不知道如何解决它...

有人可以帮助我吗?有人知道我该如何解决?您还需要更多信息吗?

谢谢!

最佳答案

在查看 DominatorTree_Expanded 时,您似乎在重复创建 SessionFactory(内存中有 144 个)。这应该只在启动时创建一次,然后用于创建任意数量的 session 。

另请参阅我在下面关于正确使用 Hibernate Session 的评论。


您的 Hibernate session 应该是请求的本地 -- 并在请求结束时关闭。在 Controller 处理和 View (JSP) 呈现期间,您可以使用“OpenSessionInView”模式将 session 绑定(bind)到线程。

我怀疑,由于您要 OutOfMemory,所以您将 Hibernate Session 保留为您的 Controller 的“实例变量”——或者作为某个地方的静态变量。永远不要这样做。

由于 Web 请求可能是并发的,因此 Controller 不应将请求处理状态(例如 Hibernate Sessions 或可变变量)共享为实例变量。这会导致单独的请求和线程之间发生不必要的交互。

关于java - 由于 org.hibernate.internal.SessionFactoryImpl 可能导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17823599/

相关文章:

java - 当堆栈跟踪仅显示 Eclipse 中的 native 方法时,如何找到导致错误的代码行

java - 如何扩展 Hibernate 带注释的类以将字段指向不同的 Hibernate 实体?

javascript - jQuery 3.1.1 appendTo 和空内存泄漏

java - 需要了解 java.sql.SQLException : No suitable driver found for jdbc:postgresql error 原因的建议

swift - 防止结合 flatMap 中的自保留循环

.net - .Net Concurrent BlockingCollection 有内存泄漏吗?

java - 将流保存到文件夹 - readDirectory() 失败 errno=20

java - 简单 HTTP 请求与 Web 服务

java - 如何修复 "error: <item> inner element must either be a resource reference or empty."?

java.lang.NoClassDefFoundError : Could not initialize class org. slf4j.LoggerFactory