2009-12-21 313 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