2012-12-17 16 views
8

Supponiamo che sto testando un'applicazione server Java. So quanto tempo ci vuole per finire il test. Ora mi piacerebbe sapere quanto è stato speso su GC durante quel test. Come posso farlo?Tempo di misurazione trascorso su GC in JVM

+0

ho contare il tempo di correre end to end nei test, inclusi i tempi GC , e lo scompongo solo quando voglio ottimizzare le prestazioni ad es. con un profiler di memoria. –

risposta

21

Credo che quando GC (Garbage Collector) sta lavorando gli arresti di applicazione e riprende quando termina GC

non credo che sia un presupposto sicuro. Sei sicuro che il garbage collector non funzioni in parallelo con il tuo codice applicazione?

Per misurare il tempo trascorso nella raccolta dei rifiuti, è possibile eseguire una query su Garbage Collector MXBean.

Prova questo:

public static void main(String[] args) { 
    System.out.println("collectionTime = " + getGarbageCollectionTime()); 
} 

private static long getGarbageCollectionTime() { 
    long collectionTime = 0; 
    for (GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()) { 
     collectionTime += garbageCollectorMXBean.getCollectionTime(); 
    } 
    return collectionTime; 
} 
+3

Questa risposta è super. Ho eseguito molti test su GC e i valori forniti da 'GarbageCollectorMXBean' sono assolutamente gli stessi rispetto al log scritto dagli argomenti di JVM. –

1

attivare i registri di raccolta dei rifiuti. Come documented, è possibile utilizzare le bandiere -verbose:gc, -XX:+PrintGCDetails e -XX:+PrintGCTimeStamps. È possibile utilizzare il flag -Xloggc per indirizzare quelli a un file.

I registri risultanti sono leggibili dall'uomo, ma per la maggior parte dei vantaggi probabilmente si desidera che vengano eseguiti attraverso un analizzatore. Tali strumenti sono elencati in this thread.

2

Questa metrica delle prestazioni è registrata dalla JVM e resa accessibile tramite JMX. Per il monitoraggio interattivo, connettersi alla JVM in esecuzione con JConsole, e nel "Sommario VM" Tab dirà qualcosa del tipo:

Garbage collector: Name = 'Copia', Collezioni = 26, tempo totale = 0,183 secondi Garbage collector: Name = 'MarkSweepCompact', Collezioni = 2, tempo totale trascorso = 0,168 secondi

È inoltre possibile interrogare JMX programatically.

1

Esistono diversi algoritmi GC che si comportano diversamente. Recentemente ho letto uno good article sull'argomento che posso consigliare se desideri saperne di più.

È possibile avviare l'applicazione con le seguenti opzioni della riga di comando -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails e ottenere informazioni su GC.

Ecco un esempio del messaggio di registro:

2012-12-17T03: 02: 15,590-0500: [GC [PSYoungGen: 40934K-> 2670K (29440K)] 48211K-> 14511K (73152K), 0.5745260 sec] [tempi: user = 0.08 sys = 0.01, reali = 0,58 sec]

3

Un'altra soluzione conveniente è quello di eseguire jstat -gc (documentation) contro il vostro processo quando i test sono fatti. Ciò ti darà un buon risultato aggregato su quanto tempo è stato speso in GC durante la vita della tua JVM.

1

Simile alla risposta di @Steve McLeod che utilizza ManagementFactory, dal momento che Java 8 questo può anche essere scritto in una sola riga usando Java streams:

long collectionTime = ManagementFactory.getGarbageCollectorMXBeans().stream().mapToLong(mxBean -> mxBean.getCollectionTime()).sum();