2011-01-08 6 views
7

voglio monitorare la frequenza GC completo in JMX. Un MBean espone il numero di GC. (cfr http://download.oracle.com/javase/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html - java.lang: type = GarbageCollector, name =).È possibile monitorare la frequenza "Full GC" in JMX (su HotSpot)?

Il problema è che MBean non distingue tra minori e piena gc.

Se qualcuno ha un'idea?

Grazie.

Arnault

+1

potresti scoprire che l'uso del vecchio gen prima/dopo gc diminuisce solo per il gc completo. Se questo è il tuo caso, allora sarà sufficiente identificare tutti i gc. – Ron

+0

[Potrebbe essere in grado di darti qualche informazione] (https://gist.github.com/khotyn/1520947) in quale tipo di GC è abilitato sulla tua JVM dove stai testando il tuo codice – KJ50

risposta

0

lo fa ... uno sguardo ai nomi per esempio Parnew, ConcurrentMarkSweep, ecc. alcuni nomi sono per minori gc, alcuni per intero gc,

+0

Ci dispiace, ma non esattamente. ParNew e ConcurrentMarkSweep sono implementazioni di algoritmi GC e per quei GC è possibile avere una raccolta minore o maggiore. – ajeanson

8

Non ne sono completamente sicuro, ma presumo che il garbage collector che controlla tutti i pool di memoria (almeno il uno per la vecchia generazione) è quello usato per i principali gc. ad esempio: Ho una JVM in esecuzione con queste 2 collettori:

  • PS MarkSweep
    • MemoryPoolNames: PS Eden Spazio, PS Survivor Spazio, PS Old Gen, PS Perm Gen
    • CollectionCount: 68
  • PS scavenging
    • MemoryPoolNames: PS Eden Spazio, PS Survivor Spazio
    • CollectionCount: 2690

Tenendo conto direi, PS scavenging è utilizzato per gc minore e PS MarkSweep per gc maggiore.

UPDATE (sulla base di commenti @ajeanson, grazie per il tuo feedback btw):

In effetti, l'esempio che ho messo lì dentro è stata presa dalle informazioni esposte nelle MXBeans della JVM che stavo usando. Come hai detto, questi sono algoritmi GC e il nome che MXBean sta utilizzando per il GC si basa sull'algoritmo che il GC sta utilizzando. Ho cercato qualche informazione in più su questo; in questo articolo http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html, si legge quanto segue:

Java HotSpot VM definisce due generazioni: la giovane generazione (a volte chiamata la "nursery") e vecchia generazione. Il giovane generazione è costituito da uno "spazio Eden" e due "spazi superstiti." La VM assegna inizialmente tutti gli oggetti allo spazio Eden, e la maggior parte degli oggetti Stampo lì. Quando esegue un GC secondario, , la VM sposta tutti gli oggetti rimanenti dallo spazio Eden a uno degli spazi dei superstiti . La VM sposta gli oggetti che sopravvivono abbastanza a lungo negli spazi del superstite nello spazio "di riserva" nella vecchia generazione . Quando la generazione protetta di tipo si riempie, c'è un GC completo che è spesso molto più lento perché lo coinvolge tutti gli oggetti live.La generazione permanente contiene tutti i dati riflettenti della macchina virtuale , come classe e metodo oggetti.

Dando uno sguardo alla proprietà collectionCount sulle MXBeans, nel caso del mio collettore "PS MarkSweep" (quella gestione della piscina vecchia generazione), il conteggio di raccolta sembra aumentare solo quando ho un GC completo nell'output dettagliato. Potrei sbagliarmi e forse in alcuni casi questo Collector esegue anche piccoli GC, ma avrei bisogno di eseguire più test per essere assolutamente sicuro di questo. Per favore, fammi sapere se qualcuno scopre qualcos'altro o hai qualche informazione più specifica su questo problema perché sono abbastanza interessato a questo.

+0

Ciao, grazie per il tuo post ma IMHO, sono due diverse implementazioni degli algoritmi GC e per quelle GC puoi avere raccolte minori o maggiori. Ho fatto un test guardando GC verbose e posso vedere alcuni "Full GC" ma solo l'incuementazione CollectionCount nei miei MBean. – ajeanson

Problemi correlati