我已经用 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/