2009-12-21 6 views
1

Je développe une application Flex avec BlazeDS et je rencontre une fuite de mémoire lors de l'utilisation de Java pour interroger MySQL en mode hibernation. Quelqu'un peut-il me dire comment faire face à cette fuite de mémoire? Il semble que chaque fois que la requête est invoquée, java.exe prend plus de mémoire.Java Hibernate Mémoire fuite

Merci

échantillon de mon 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

Comment diagnostiquez-vous que c'est une fuite de mémoire? Ce qu'on appelle une fuite de mémoire est lorsque votre application conserve un objet qui n'est plus nécessaire, vous le voyez si après chaque collecte de place vous avez moins de mémoire libre qu'après la collecte de place précédente ... jusqu'à ce que vous obteniez un OutOfMemoryError ... – pgras

+0

oh , vous utilisez glassfish. Vérifiez ma mise à jour de réponse .. – Bozho

Répondre

2

Je suppose que vous quittez votre EntityManager ouvert après votre retour les données à fléchir, ce qui signifie à son tour que votre connexion MySQL reste ouverte. C'est de là que vient la fuite de mémoire. Alors - fermez votre EntityManager.

Dans un commentaire, vous avez indiqué que vous utilisez GlassFish. C'est un tout nouveau scénario. Est-ce que votre classe est une servlet? Un EJB? GlassFish est supposé gérer vos EntityManagers (si la classe elle-même est gérée), vous n'avez donc pas besoin de le créer ou de le fermer vous-même. Dans ce cas, utiliser l'annotation @PersistenceContext pour injecter le EntityManager (au lieu d'utiliser Persistence.create..)

Mais la chose que vous devez faire tout ce que la configuration, est de commencer un profileur et voir où est cette mémoire allouée.

+0

Essayé mais ne fonctionne toujours pas. Je mets em.close(); à une ligne avant chaque retour, mais le souvenir continue de croître déraisonnablement. – Pii

+0

l'a fermé avec succès? Gardez à l'esprit que la mémoire peut augmenter jusqu'à un certain point jusqu'à la récupération de la mémoire. Par conséquent, comme indiqué dans le commentaire sur votre question, attendez de voir si une erreur OutOfMemoryError se produit. – Bozho

+0

Pouvez-vous me donner un exemple complet de la façon dont les choses devraient ressembler? actuellement, je viens d'ajouter em.clear(); em.close(); factory.close(); avant le retour et il semble aider plus ou moins. Est-ce correct? – Pii

0

Salut, vous avez juste besoin de sortir votre code dans un bloc try catch et fermez le gestionnaire d'entités.

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

Maintenant, j'ai java.lang.IllegalStateException: EntityManager est fermé J'utilise Glassfish v3 en passant. Y a-t-il quelque chose à voir avec ça? – Pii