Recherche d'instances en cours d'exécution dans une machine virtuelle Java en cours d'exécution

StackOverflow https://stackoverflow.com/questions/421422

  •  05-07-2019
  •  | 
  •  

Question

Je me demande s'il est possible d'avoir un aperçu de l'exécution des instances d'une classe donnée. Le problème qui a déclenché cela est une application qui ne se ferme pas bien à cause d'un certain nombre de threads en cours d'exécution.

Oui, je sais que vous pouvez démoniser les theads et qu’ils ne retarderont pas l’exit de l’application. Mais cela m’a amené à me demander si cela était possible. La chose la plus proche que je puisse trouver est les chargeurs de classes (protégés!) findLoadedClass , bien que vous deviez utiliser votre propre chargeur de classes pour le faire.

Sur une note connexe, s’agit-il de la façon dont les outils de profilage gèrent le suivi des descripteurs d’objet? en exécutant leurs propres chargeurs de classe personnalisés? ou y a-t-il une manière astucieuse que je ne vois pas?

Était-ce utile?

La solution

Vous pouvez en effet obtenir une trace de la pile de tous les threads en cours d’exécution vidés sur la sortie standard en utilisant kill -QUIT <pid> sur un système d’exploitation * NIX, ou en exécutant l’application dans une console Windows et en appuyant sur Ctrl-Pause (comme un autre afficheur note. )

Cependant, il semble que vous demandiez des moyens programmatiques de le faire. Donc, en supposant que ce que vous voulez vraiment, c'est l'ensemble de tous les threads dont les piles d'appels actuelles incluent une ou plusieurs méthodes d'une classe donnée ...

La meilleure chose que je puisse trouver sans impliquer d'appels dans JVMTI est d'inspecter les piles de tous les threads en cours d'exécution. Je n'ai pas essayé cela, mais cela devrait fonctionner dans Java 1.5 et versions ultérieures. Gardez à l’esprit que, par définition, cela n’est pas tout à fait sécuritaire pour les threads (la liste des threads en cours d’exécution - ainsi que leurs traces de pile actuelles - changera constamment sous vous ... beaucoup de choses paranoïaques seraient nécessaires pour pouvoir les utiliser de cette liste.)

public Set<Thread> findThreadsRunningClass(Class classToFindRunning) {

  Set<Thread> runningThreads = new HashSet<Thread>();
  String className = classToFindRunning.getName();

  Map<Thread,StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
  for(Thread t : stackTraces.keySey()) {
    StackTraceElement[] steArray = stackTraces.get(t);
    for(int i = 0;i<steArray.size();i++) {
      StackTraceElement ste = steArray[i];
      if(ste.getClassName().equals(className)) {
        runningThreads.add(t);
        continue;
      }
    }
  }

  return runningThreads;
}

Faites-moi savoir si cette approche vous convient!

Autres conseils

De cette page ,

  

Un profileur Java utilise une interface native avec la machine virtuelle Java (le JVMPI pour Java < = 1.4.2 ou le JVMTI pour Java > = 1.5.0 ) pour obtenir des informations de profilage à partir d'une application Java en cours d'exécution.

Cela représente un code natif fourni par Sun . qui donne un profileur accroché à la machine virtuelle.

Si vous n'avez besoin que d'une trace rapide de la pile de votre application en cours d'exécution pour savoir quels threads bloquent la sortie de la machine virtuelle Java, vous pouvez lui envoyer le signal QUIT.

$ kill -QUIT <pid of java process>

Sous Windows, vous devez exécuter l'application dans une fenêtre de console (avec java.exe et non javaw.exe). Vous pouvez ensuite appuyer sur Ctrl-Pause pour générer le vidage de la pile. Dans les deux cas, il & # 8217; est écrit sur la sortie standard.

J'utilise Visual VM pour surveiller la machine virtuelle Java. A beaucoup de fonctionnalités, essayez-le.

Je pense que vous avez besoin d'un vidage de thread Java . Cela devrait lister tous les sujets avec ce qu'ils font en ce moment. J'ai moi-même rencontré un problème similaire, qu'un fichier de vidage de threads a aidé à résoudre (les threads du planificateur Quartz, qui ne se sont pas arrêtés lorsque Tomcat a terminé).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top