Java Hibernate内存泄漏
我正在用BlazeDS开发一个Flex应用程序,在hibernate中使用java查询MySQL时遇到内存泄漏问题。谁能告诉我如何处理这个内存泄漏?似乎每次调用查询时,java.exe都会占用更多内存 谢谢 我的java示例Java Hibernate内存泄漏,java,apache-flex,hibernate,memory-leaks,blazeds,Java,Apache Flex,Hibernate,Memory Leaks,Blazeds,我正在用BlazeDS开发一个Flex应用程序,在hibernate中使用java查询MySQL时遇到内存泄漏问题。谁能告诉我如何处理这个内存泄漏?似乎每次调用查询时,java.exe都会占用更多内存 谢谢 我的java示例 factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); EntityManager em = factory.createEntityManager(); Query find = em.cr
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;
factory=Persistence.createEntityManagerFactory(Persistence\u单元);
EntityManager em=factory.createEntityManager();
Query find=em.createNamedQuery(“Plan.findByStudentId”);
find.setParameter(“studentId”,studentId);
List c=find.getResultList();
返回c;
我假设在将数据返回到flex后,您的EntityManager将保持打开状态,这反过来意味着您的MySQL连接将保持打开状态。这就是内存泄漏最有可能的原因。因此-关闭您的实体管理器
在另一条评论中,你说你正在使用玻璃鱼。这是一个全新的场景。您的类是一个Servlet吗?EJB?。GlassFish应该管理您的EntityManager(如果类本身是托管的),因此您不必自己创建或关闭它。在这种情况下,使用@PersistenceContext
注释插入EntityManager
(而不是使用Persistence.create..
)
但无论设置如何,您都必须启动探查器,查看内存分配到哪里。您好,您只需在try-catch块中取出代码并关闭实体管理器。
try{
if(em !=null){
em.close();
}
} catch(Exception e){
e.printStackTrace();
} finally {
em.close();
}
你如何诊断它是内存泄漏?所谓内存泄漏是指当应用程序保留不再需要的对象时,如果每次垃圾收集后的可用内存少于上一次垃圾收集后的可用内存,就会看到内存泄漏。。。直到你得到一个OutOfMemoryError…哦,你在用glassfish。检查我的更新答案..尝试过但仍然无效。我把它们关上了;在每次返回前一行,但内存仍然不合理地增长。它是否成功关闭?请记住,内存可能会增长到某个点,直到垃圾被回收,因此,正如在您的问题的评论中所指出的,请等待,看看是否会发生OutOfMemory错误。您能给我一个完整的示例,说明情况应该如何?目前,我刚刚添加了em.clear();em.close();工厂关闭();在返回之前,它似乎或多或少有帮助。这是正确的吗?如果对你有效,那就好了。但是告诉我这节课是什么?它只是一个由BlazeDS加载的POJO吗?或者它是一个servlet/EJB?在前一种情况下,手动操作可能是合适的。在后者中,我将提供一些链接。现在我得到了java.lang.IllegalStateException:EntityManager已关闭,顺便说一下,我正在使用Glassfish v3。这有什么关系吗?