Avec récente Sun JVMs (1.6), est-il possible d'obtenir GC informations de fil?
-
08-10-2019 - |
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
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é ...