【问题标题】:Java Hibernate Memory leakJava Hibernate 内存泄漏
【发布时间】:2009-12-21 08:05:16
【问题描述】:

我正在使用 BlazeDS 开发一个 Flex 应用程序,当我在休眠状态下使用 java 从 MySQL 查询时遇到内存泄漏。谁能告诉我如何处理这种内存泄漏?似乎每次调用 java.exe 查询都会占用更多内存。

谢谢

我的 java 示例

factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
EntityManager em = factory.createEntityManager();

Query find = em.createNamedQuery("Plan.findByStudentId");
find.setParameter("studentId", studentID);

List<Plan> c = find.getResultList();

return c;

【问题讨论】:

  • 你如何诊断它是内存泄漏?所谓的内存泄漏是当您的应用程序保留不再需要的对象时,如果在每次垃圾回收之后您的可用内存比上一次垃圾回收之后更少,您就会看到它...直到您收到 OutOfMemoryError...跨度>
  • 哦,你正在使用 glassfish。检查我的更新答案..

标签: java apache-flex hibernate memory-leaks blazeds


【解决方案1】:

我假设您在将数据返回给 flex 后保持 EntityManager 处于打开状态,这反过来意味着您的 MySQL 连接保持打开状态。这就是内存泄漏最有可能的来源。所以 - 关闭你的EntityManager

在另一条评论中,您说您正在使用 GlassFish。这是一个全新的场景。你的类是 Servlet 吗?一个 EJB? GlassFish 应该管理您的 EntityManagers(如果类本身是托管的),因此您不必自己创建或关闭它。在这种情况下,使用@PersistenceContext 注解注入EntityManager(而不是使用Persistence.create..

但无论设置如何,您都必须做的事情是启动一个分析器并查看该内存分配在哪里。

【讨论】:

  • 试过了,还是不行。我把 em.close();每次返回前一行,但内存仍然不合理地增长。
  • 关闭成功了吗?请记住,在垃圾收集之前,内存可能会增长到某个点,因此,如您问题的评论中所述,请等待看看是否会发生 OutOfMemoryError。
  • 你能给我一个完整的例子吗?目前,我刚刚添加了 em.clear(); em.close();工厂.close();在返回之前,它似乎或多或少有帮助。这是正确的吗?
  • 如果它对你有用,那么好的。但是告诉我这门课是什么?它只是一个 POJO,由 BlazeDS 加载吗?或者它是一个servlet/EJB?在前一种情况下,手动处理可能是合适的。在后者中 - 我会给你一些链接。
【解决方案2】:

您好,您只需在 try catch 块中输出您的代码并关闭实体管理器。

try{
    if(em !=null){
        em.close();
    }
} catch(Exception e){
    e.printStackTrace();
} finally {
    em.close();
}

【讨论】:

  • 现在我得到了 java.lang.IllegalStateException : EntityManager is closed 我正在使用 Glassfish v3。这有什么关系吗?
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2015-08-14
  • 2012-08-11
  • 2015-12-14
相关资源
最近更新 更多