Question

Avec JRockit, vous pouvez obtenir la liste complète des fils par tout moyen, et tous ces moyens comprennent des informations sur la collection Garbage fil (s):

1) Demander la classe Thread de l'information:

Thread.getAllStackTraces();

2) A l'aide ThreadGroup pour obtenir cette information:

ThreadGroup root = Thread.currentThread().getThreadGroup();
while (root.getParent() != null) {
    root = root.getParent();
}
Thread[] list = new Thread[root.activeCount() + 5];
root.enumerate(list, true);

3) A l'aide JMX pour obtenir la liste:

ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean();
long[] tids = THREAD_MX_BEAN.getAllThreadIds();
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids);

4) CTRL-BREAK

Cependant, en utilisant la machine virtuelle Java de Sun - au moins récents Java 6 versions - seulement CTRL-BREAK semble inclure les ordures et les discussions Collection le fil périodique Tâche VM. Je trouve utile de surveiller CPU utilisé par les fils de GC donc mon application peut détecter et se connecter lorsque GC utilise la plupart du temps CPU. Sans ces informations, vous ne savez quand GC dépasse certains seuils fixés.

Si je peux même trouver que l'ID de fil des fils de GC, puis JMX probablement donner le reste de l'information nécessaire (à moins que quelque chose de différent au sujet de ces threads). Par exemple, en utilisant la méthode:

long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);

Quelqu'un sait comment - ou si elle est connue pour être impossible - pour obtenir des informations sur la collecte des ordures fil (s) à l'aide de la machine virtuelle Java de Sun

Était-ce utile?

La solution

Ceci est spécifique à Java 1.5+ JVM Sun (HotSpot). Inscrivez-vous MBean sun.management.HotspotInternal dans le MBeanServer vous cherchez à surveiller de. Cela déclenchera l'enregistrement de ces mbeans internes HotSpot:

  • sun.management:type=HotspotClassLoading
  • sun.management:type=HotspotCompilation
  • sun.management:type=HotspotMemory
  • sun.management:type=HotspotRuntime
  • sun.management:type=HotspotThreading

HotspotThreading MBean a un attribut appelé InternalThreadCpuTimes qui est une carte de fils GC internes de filetages HotSpot sont identifiables par leur nom. Par exemple, dans la machine virtuelle Java je courais en ce moment, ils sont appelés:

  • GC tâche fil # 1 (ParallelGC)
  • GC tâche fil # 0 (ParallelGC)

La valeur de la carte est le temps de calcul pour chaque fil.

HotSpotMemory MBean a aussi un attribut appelé InternalMemoryCounters qui a quelques bits d'information supplémentaires sur GC.

Autres conseils

Une première étape consiste à utiliser verbosegc: java -verbose:gc -XX:+PrintGCDetails, qui vous donnera des informations sur (horloge murale) temps consommé dans les opérations GC, et le type d'opération (complète ou incrémentale). Votre question semble demander si vous pouvez l'obtenir par programmation -. Peut probablement obtenir quelques informations via E / F Gestion

Edité pour ajouter: Une partie de c'est disponible via le MemoryMXBean, mais pas les détails du temps GC. Désolé ...

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