2009-12-21 128 views
1

我正在开发一个Flex应用程序与BlazeDS和我遇到内存泄漏时使用Java在休眠状态下从MySQL查询。任何人都可以告诉我如何处理这种内存泄漏?似乎每次查询被调用java.exe需要更多的内存。Java休眠内存泄漏

感谢

样品我的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; 
+0

如何诊断它是内存泄漏?所谓的内存泄漏是指当应用程序保留不再需要的对象时,如果每次垃圾回收之后内存空间少于之前的垃圾回收之后,您会看到它......直到出现OutOfMemoryError ... – pgras 2009-12-21 08:35:35

+0

哦,你正在使用glassfish。检查我的更新答案.. – Bozho 2009-12-21 12:22:23

回答

2

的我假设你离开你的EntityManager打开返回的数据弯曲,这反过来又意味着你的MySQL连接保持打开后。这就是内存泄漏最可能出现的地方。所以 - 关闭你的EntityManager

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

(而不是使用Persistence.create..)但是,事情必须做任何的设置,是开始探查,并看这个内存分配的地方。

+0

尝试过,但仍然无法正常工作。我把em.close();在每次回归之前的一行中,但记忆仍然不合理地增长。 – Pii 2009-12-21 09:06:57

+0

是否成功关闭? 请记住,内存可能会增长到某种程度,直到垃圾收集,所以,如问题的评论中所述,请等待以查看是否会发生OutOfMemoryError。 – Bozho 2009-12-21 09:13:53

+0

你能给我一个完整的例子,说明事情应该是什么样子? 目前,我刚加入 em.clear(); em.close(); factory.close(); 之前,它似乎有所帮助或多或少。它是否正确? – Pii 2009-12-22 03:22:30

0

嗨,你只需要在try catch块中取出你的代码并关闭实体管理器。

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

现在我得到了java.lang.IllegalStateException:EntityManager关闭了 我正在使用Glassfish v3。这有什么关系? – Pii 2009-12-21 09:28:27