2011-07-19 2 views
2

Comme je l'ai trouvé quelque part sur le web, les éléments suivants peuvent entraîner des fuites de mémoire. Par exemple:Comment gérer les fuites de mémoire dans Java EE?

  • ResultSets et objets Déclaration
  • DataLists
  • Collections
  • variables statiques et des classes
  • singletons
  • HttpSession et HttpRequest

haricots gérés dans mon application JSF sont pour la plupart @ViewScoped, donc je pensait qu'après avoir quitté la vue, GC avait assez d'informations pour publier des données, des objets, etc. Mais il n'a pas ou non completelly:

enter image description here

Je suis juste la fermeture des sessions de mise en veille prolongée manuellement (en utilisant enfin), mais c'est tout. Le reste des choses que je m'attendais de GC.

Pourriez-vous me dire,

  • comment trouver les objets concrets sont rester en mémoire?
  • comment libérer des objets après avoir quitté une vue manuellement? quelque chose comme un destructeur ..?
  • Quelles sont les meilleures pratiques pour gérer les fuites de mémoire?
+0

JHat, MAT (http://www.eclipse.org/mat/) peut être utile. Même, JConsole donne assez d'indices sur les fuites de mémoire - ou du moins ce qui monopolise toute votre RAM. – Nishant

+0

Merci, Nishant, je vais essayer MAT :) – gaffcz

+0

MAT m'aide beaucoup, faites la réponse, si vous voulez, et je vais l'accepter :) – gaffcz

Répondre

1

jhat, Eclipse MAT peut être utile. Même, JConsole donne assez d'indices sur les fuites de mémoire - ou du moins ce qui monopolise toute votre RAM.

1

Vous devez utiliser l'un des profileurs java disponibles. Il y a beaucoup. Tous les profileurs permettent de stocker des snapshots et de comparer des snapshots. Donc, vous devez stocker l'instantané au début, puis effectuer un scénario avec votre application, puis stocker à nouveau l'instantané et comparer. Vous obtiendrez tous les objets qui ne peuvent pas être supprimés par GC et leurs références. Ensuite, essayez d'analyser qui détient des références à ces objets et comment corriger le bug.

+0

Merci, AlexR, je fais quelque chose de similaire, et MAT me dit, que mon problème est non publié 'org.hibernate.impl.SessionFactoryImpl @ 0x3f026c0 - 652 664 (1,24%) octets'. Je dois trouver comment utiliser l'usine de session – gaffcz

1

Tout d'abord à mon humble avis, ce n'est pas une véritable fuite de memmory. GC libère memmory de temps en temps. Peut-être que vous devriez nous montrer le rapport de plus longtemps. Peut-être que sth tient les objets trop longtemps. Pour regarder les références, vous pouvez utiliser JProfiler comme here. Essayez aussi les rapports automatiques Eclipse Memory Analyzer. Je pense que vous devriez essayer tuning Garbage Collection. Et pour trouver des fuites regard memmory à cette réponse How to find a Java Memory Leak

+0

Merci zacheusz! – gaffcz

2

Nous, dans notre projet, ont utilisé YourKit (http://www.yourkit.com/eap/index.jsp) profileur. J'ai trouvé l'interface utilisateur très sympathique.

Vous pouvez vous connecter à votre application Web et connaître la croissance de l'objet et le taux de croissance.

Le profileur vous aide à tracer chaque objet à l'origine. Vous pouvez donc déterminer l'objet parent qui contient une référence à l'objet qui n'est pas collecté.

Méfiez-vous:

  • Lorsque vous avez une collection java chargée et fini avec elle, attribuer collectionObject=null. nous avons remarqué que même si la liste était hors de portée, elle ne récupérait pas les ordures tant qu'elles n'étaient pas définies.

  • Objets créés en boucle.

  • objets référencés dans les classes. ces objets ont tendance à rester dans le système jusqu'à ce que toutes les références soient libérées.

  • Les concaténations de chaînes (String a = b+s) sont très très coûteuses!

  • Surcharger session HTTP

+0

Merci beaucoup, Lakshmi! – gaffcz

Questions connexes