IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Analyse thread dump


Sujet :

Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Analyse thread dump
    Bonjour à tous,

    Je viens chercher de l'aide sur ce forum afin d'analyser un thread dump Java.
    Concrètement, mon application sature son pool de 100 connexions assez régulièrement et à chaque fois que cela se produit je trouve dans le thread dump une quarantaine de thread dans le statut 'Waiting on monitor' généralement bloqué par le même thread.
    Voici la stack trace obtenu lors du crash d'hier:
    Runnable 59 39 (%)
    Waiting on condition 45 30 (%)
    Waiting on monitor 48 32 (%) - en temps normal ce nombre est a zéro

    State Waiting on monitor
    Monitor Waiting for Monitor Lock on com.ibm.ws.classloader.CompoundClassLoader@34945718/34945720
    Java Stack
    at fr.capeb.gestionfiches.hibernate.helper.SynComplGeoHelper.findMillesimeByCompteurSyndLight(Unknown Source) at fr.capeb.gestionfiches.hibernate.helper.ArtArtisanGeoHelper.findArtArtisanSigneLightByCode(Unknown Source) at fr.capeb.gestionfiches.service.ArtisanService.ArtArtisanGeoLightRemplirFicheIDArtisan(Unknown Source) at fr.capeb.gestionfiches.action.RechercheArtisanAction.execute(Unknown Source)(Compiled Code) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java(Inlined Compiled Code)) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java(Compiled Code)) at org.apache.struts.action.ActionServlet.process(ActionServlet.java(Inlined Compiled Code)) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java(Compiled Code)) at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) at com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java(Inlined Compiled Code)) at com.ibm.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java(Compiled Code)) at com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java(Compiled Code)) at com.ibm.ws.cache.servlet.ServletWrapper.service(ServletWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServicingServletState.service(StrictLifecycleServlet.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(Inlined Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at fr.capeb.utils.ConnectionManagerFilter.doFilter(Unknown Source)(Compiled Code) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at fr.capeb.utils.SessionFilter.doFilter(Unknown Source)(Compiled Code) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code)) at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code)) at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code)) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code)) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code)) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code)) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))

    Ceci pour le thread bloqué (au statut waiting on Monitor)

    Et voici pour le thread bloquant:
    State
    Runnable
    Monitor
    Owns Monitor Lock on com.ibm.ws.classloader.CompoundClassLoader@34945718/34945720
    Java Stack
    at java.io.WinNTFileSystem.getBooleanAttributes(Native Method) at java.io.File.exists(File.java(Compiled Code)) at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java(Compiled Code)) at sun.misc.URLClassPath.getResource(URLClassPath.java(Compiled Code)) at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java(Compiled Code)) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.ReloadableClassLoader.loadClass(ReloadableClassLoader.java(Compiled Code)) at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java(Compiled Code)) at java.lang.ClassLoader.loadClass(ClassLoader.java(Compiled Code)) at java.lang.Class.forName0(Native Method) at net.sf.hibernate.util.ReflectHelper.classForName(ReflectHelper.java(Inlined Compiled Code)) at net.sf.hibernate.hql.QueryTranslator.getImportedClass(QueryTranslator.java(Inlined Compiled Code)) at net.sf.hibernate.hql.QueryTranslator.concreteQueries(QueryTranslator.java(Compiled Code)) at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java(Inlined Compiled Code)) at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java(Inlined Compiled Code)) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java(Compiled Code)) at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java(Compiled Code)) at fr.capeb.gestionfiches.hibernate.helper.RechercheArtisanHelper.executeResearchArtisanQuery(Unknown Source)(Compiled Code) at fr.capeb.gestionfiches.action.RechercheArtisanAction.execute(Unknown Source)(Compiled Code) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java(Inlined Compiled Code)) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java(Compiled Code)) at org.apache.struts.action.ActionServlet.process(ActionServlet.java(Inlined Compiled Code)) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java(Compiled Code)) at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) at com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java(Inlined Compiled Code)) at com.ibm.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java(Compiled Code)) at com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java(Compiled Code)) at com.ibm.ws.cache.servlet.ServletWrapper.service(ServletWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServicingServletState.service(StrictLifecycleServlet.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(Compiled Code)) at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(Inlined Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at fr.capeb.utils.ConnectionManagerFilter.doFilter(Unknown Source)(Compiled Code) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at fr.capeb.utils.SessionFilter.doFilter(Unknown Source)(Compiled Code) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java(Compiled Code)) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code)) at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code)) at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code)) at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code)) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code)) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code)) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code)) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code)) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code)) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))

    De ce que je comprends le thread est en attente d'une info sur un fichier du file system, mais est-ce vraiment ça ? et surtout comment résoudre ce problème ?

    Merci d'avance a toute bonne volonté qui répondra.

    Sébastien

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Cela ressemble à un dead-lock... mais c'est difficile à en déterminer l'origine exacte.

    Citation Envoyé par 1ereClasseTac Voir le message
    mon application sature son pool de 100 connexions assez régulièrement
    C'est quoi exactement ces connexions ? S'il s'agit d'une ressource libérable il faut bien penser à le faire via un try/finally...

    a++

  3. #3
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Points : 73
    Points
    73
    Par défaut
    Bonjour,
    pour détecter les dead lock tu peut utiliser Jconsole fourni avec le JDK

    il est trés utiles pour visualiser le fonctionnement des thread en cours de l'exécution de l'application

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses !

    Concernant le pool de connexion, il s'agit du paramétrage de la data source sous la console d'administration Websphere que nous avons mis à 100.
    Il s'avère que ce pool n'est pas suffisant car il semble que des connexions restent ouvertes mais nous avons un système de filtre qui s'occupe de libérer les connexions d'où la difficulté de tracer ce problème.

    Je travaille avec WASD 5.1, et un JDK 1.3. J'espère que Jconsole est compatible, j'étudie ça tout de suite.

    Sinon, j'ai eu beau cherché à savoir ce que ce 'Waiting on monitor' signifie mais cela reste assez obscure, dans le thread dump ce n'est pas considéré comme un dead lock même si ça bloque quand même des threads.

    Encore merci.

  5. #5
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Août 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2008
    Messages : 176
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par 1ereClasseTac Voir le message
    Merci pour vos réponses !



    Je travaille avec WASD 5.1, et un JDK 1.3. J'espère que Jconsole est compatible, j'étudie ça tout de suite.

    Encore merci.
    si tu as la possibilité de passer à la JDK 1.6 n'hésiter pas elle contient une enorme amélioration dans la synchronisation de thread ( biased locking : élimine les opérations de synchronisation inutile sur les objets à accès non concurrentiel, adaptative spinning, escape analysis .........)

    pour le jconsole je croi il est fournie a partir de la jdk 1.5

    bonne courage

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 1ereClasseTac Voir le message
    Il s'avère que ce pool n'est pas suffisant car il semble que des connexions restent ouvertes mais nous avons un système de filtre qui s'occupe de libérer les connexions d'où la difficulté de tracer ce problème.
    A mon avis ce serait de ce coté là qu'il faudrait se tourner.

    Comment sont utilisées ces connexions ? C'est quoi ce système de filtre ?

    a++

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Ce système de filtre est intégré a Java depuis quelque temps déjà (http://java.sun.com/products/servlet/Filters.html), après, les connexions à la base de donnée passent par Hibernate ce qui complique encore le tout.

    Ce que je pense c'est que les locks que j'observe dans le Thread Dump sont la cause de la non libération des connexions. D'ou ma question initiale: s'agit-il vraiment d'un problème lié a un fichier ? Si oui comment puis-je résoudre ce type de souci ?

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 1ereClasseTac Voir le message
    Ce que je pense c'est que les locks que j'observe dans le Thread Dump sont la cause de la non libération des connexions.
    Donc il faut faire en sorte de fermer proprement ces connexions...

    a++

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    J'expliquais que pour moi c'est le lock dans les threads qui entraine la non libération des connexions (et pas un problème de fermeture mal faite) et je demandais un deuxième avis vu que je ne sais pas vraiment lire les Thread Dump.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans les deux cas personne ne pourra t'aider sans code source ni plus d'info sur ces connexions...

    a++

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Oula, j'avais zappé une réponse de Sfaxiano.
    Donc passer au JDK 1.6 pourrait aider... je regarde ça, merci.

Discussions similaires

  1. Thread Dump d'un processus déjà sous GDB
    Par bsquare dans le forum GDB
    Réponses: 1
    Dernier message: 05/12/2012, 10h55
  2. Tomcat5.5.25 Thread dump analyse
    Par jamelledine_med dans le forum Général Java
    Réponses: 0
    Dernier message: 04/07/2011, 00h31
  3. Analyser un dump pour y recuperer des donnees!
    Par nixmind dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 25/02/2011, 20h40
  4. Réponses: 0
    Dernier message: 13/05/2010, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo