Possible Fuite de Mémoire en raison de org.mise en veille prolongée.interne.SessionFactoryImpl
J'ai fait, et MVC de l'application web en Java, mais quand je le lance, une fois par jour, il se tourne vers le bas encore une fois dû à une erreur de mémoire.
Cette erreur est ceci:
Exception in thread "http-avr-12136-exec-42" de java.lang.OutOfMemoryError: Java heap space
java.sql.SQLException: java.lang.OutOfMemoryError: Java heap space
J'ai le hprof avec les stats de l'accident, le cas spécifique de la façon dont la mémoire est utilisée. Si j'ouvre la hprof avec l'Éclipse de la Mémoire Analizer, j'ai ce résultat:
En rar: https://mega.co.nz/#!Ht41xJDJ!MooePBSv5yOYSNN5OuvF7Afn2rcN-KJ2tXGSsgqtsaI
Ou dans un dossier: https://mega.co.nz/#F!6hJUyKbQ!D_Kb23E3KfAJqcd5EeAt0A
Dans le rapport de synthèse, j'ai cette image (en OverviewEMA.JPG):
Je ne sais pas ce que ce graphique dire... je ne comprends pas.
Dans le deuxième onglet, le rapport par défaut, j'ai cette image (en DefaulReport_EMA.JPG):
Il disent que le problème peut être une instance de "org.mise en veille prolongée.interne.SessionFactoryImpl". Mais je ne sais pas comment résoudre cette instance.
Dans les onglets suivants. Dans le dominateur de l'arbre, apparaît de nouveau l'exemple précédent, qui utilisent autour de 42MO de la mémoire (les mêmes qui montrent le premier graphique). L'image est DominatorTree_EMA.JPG
Si je développez le premier de la classe (la classe qui donne des problèmes), j'ai cette image (en DominatorTreeExpanded_EMA.JPG):
Dans l'onglet suivant, dans l'histogramme, le graphique est ce (Histogram_EMA.JPG):
Et dans la file d'objets, le résultat est le (UnreachableObjects_EMA.JPG):
Je ne comprends pas très bien ces 2 derniers graphiques
Enfin, j'ai également le rapport de Java VisualVM, où j'ai cette résultats (Heapdump_JVM.JPG):
Selon ce graphique, la table de hachage objets sont le problème, en plus Integer et String objets. La table de hachage des objets, je pense, sont les objets du modèle que les classes envoyer des fichiers jsp, et il va de l'avant à partir de la JPA des Objets (les objets de mise en veille prolongée), de sorte que le problème pourrait être cela, mais je ne sais pas comment le résoudre...
Quelqu'un pourrait-il m'aider? Quelqu'un sait comment je peux résoudre ce problème? Avez-vous besoin de quelques informations de plus?
Merci!
OriginalL'auteur pitu_rfr | 2013-07-24
Vous devez vous connecter pour publier un commentaire.
Sur l'examen de DominatorTree_Expanded, vous avez l'air d'être de la création de SessionFactorys à plusieurs reprises (il y a 144 en mémoire). Cela devrait être créé qu'une seule fois, au démarrage, ensuite utilisé pour créer n'importe quel nombre de Séances.
Voir aussi mes commentaires ci-dessous sur l'utilisation appropriée de la Session Hibernate.
Votre session Hibernate doit être local à la demande-et fermé lorsque la demande se termine. Vous pouvez utiliser le bouton "OpenSessionInView" modèle de lier une session sur le fil lors de Contrôleur de traitement & Vue (JSP) de rendu.
Je suppose, puisque vous allez OutOfMemory, que vous êtes en gardant une Session Hibernate comme une "variable d'instance" de votre Contrôleur -- ou comme statique quelque part. Cela ne devrait jamais être fait.
Depuis le web, les demandes peuvent être simultanées, un Contrôleur de gestion ne doivent jamais partager de traitement des demandes de l'état (tels que les Sessions Hibernate, ou mutable variables) comme variables d'instance. Ce serait de causer des interactions entre les différentes demandes & fils.
Contrôleur de l'amende, il y a peut être quelque chose d'étrange la façon dont vous configurez votre SessionFactory ou ApplicationContext. Ce que vous faites, vous le faites à de nombreuses reprises quand il doit être fait une fois. Voir: static.springsource.org/spring/docs/3.0.x/reference/...
OriginalL'auteur Thomas W
Désolé, je ne peux pas écrire avec la ligne des espaces, et donc j'écris une nouvelle réponse.
Le problème pourrait être le texte que j'ai mis avant dans le commentaire de votre réponse? Je déclarer les Classes de Contrôleur de ce genre.
L'objet que je crée beaucoup de temps, c'est que HttpServletRequest et de la Réponse? Ou est l'autre?
Je ne sais pas où je crée le SessionFactorys.
L'autre endroit possible, pourrait être dans le Dao, où je déclare une Entité Gestionnaire de ce genre dans tous les Dao.
Certains de ce qui pourrait être le problème?
Merci encore!
Le partage de l'HB Session (EntityManager) est également tout à fait incorrect pour le multi-utilisateur/ utilisation simultanée.
Ok. J'ai lu le Printemps tutoriel soigneusement à nouveau. Dites-vous que je ne devrais pas partager HB Session. Est la vérité? Si vous dites cela, que dois-je faire? Dois-je utiliser SessionFactory au lieu de EntityManager? Ou dois-je changer mon applicationContext ou la déclaration de mon JPADao?
Utilisation SessionFactoryUtils.getSession() pour obtenir la session en cours, et OpenSessionInView Filtre à lier une Session Hibernate pour le thread en cours pour la durée de traitement des demandes & vue (JSP) de rendu. Les Sessions Hibernate doit être par-fait la demande, longue durée de vie & partagée à l'échelle mondiale, puisque c'est la cause de votre croissance perpétuelle & OOM problème ainsi que d'être tout à fait incorrect de filetage & utilisateur multi-points de vue.
Vous pouvez également utiliser SessionFactory ou EntityManagerFactory JPA (équivalent), et de créer une Session/l'EntityManager par appel de méthode. Cependant objets renvoyés de cette façon, ne peut pas paresseux-la charge après la fermeture de la Session. Depuis que j'ai aidé à vous & correctement répondu à la question, vous pouvez accepter ma réponse ci-dessus maintenant. Thx.
OriginalL'auteur pitu_rfr
Ok. Merci.
Et comment dois-je déclarer l'EntityManager??
Je suis en train de lire le lien de mise en veille prolongée dans Springsource, mais je ne vois rien qui extrange dans mon code. Je ne sais pas comment je dois faire...
Mon applicattionContext.xml est-ce:
Comment je dois faire applicationContext.xml? Et comment je dois déclarer l'EntityManager dans les classes?
Ou pensez-vous que je devrais utiliser SessionFactory??
Désolés pour la gêne occasionnée.
OriginalL'auteur pitu_rfr