2013-03-09 18 views
10

Sto usando jstat per ottenere il tempo totale accumulato per le operazioni di GC, cioè GCTCalcolo della% di tempo GC server Java

Quindi, assumere GCT è di 2 secondi, e il mio processo di JVM avviato per 60 secondi, sono io l'esecuzione su Quad core sever, quindi la mia% di GC è

2/60 * 4 = 0.83% 

è il mio calcolo di cui sopra è corretto?

risposta

3

no, non proprio. il tuo calcolo assume il 100% di utilizzo di tutti e 4 i core dai processi Java durante tutto il tempo.

il calcolo corretto è (time spent in logic)/(time spent in gc) ma ottenere il primo pezzo di informazioni di solito richiede un profiler.

+0

Questo ha senso, ma è possibile recuperare il valore di "tempo trascorso in logica" utilizzando jstat o altri strumenti? Grazie – Ryan

6

No, il calcolo non è preciso, perché in questo modo non si conosce l'ora esatta in cui il sistema operativo ha consentito l'esecuzione del programma.

Supponendo che si vuole considerare il tempo in cui l'applicazione è stata completamente fermo dal GC (tempo di pausa), è possibile utilizzare le seguenti opzioni JVM:

-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 

Questa opzione farà la cosa di stampa JVM in questo modo a stdout:

Application time: 3.3319318 seconds 
Total time for which application threads were stopped: 0.7876304 seconds 
Application time: 2.1039898 seconds 
Total time for which application threads were stopped: 0.4100732 seconds 

è quindi possibile riassumere i tempi per i quali è stato fermato l'applicazione e dividerlo per la somma del tempo di applicazione più il tempo di pausa per ottenere l'utilizzo mutatore (frazione di tempo in cui il l'applicazione non è stata messa in pausa da GC).

Vedi anche http://prefetch.net/blog/index.php/2008/02/18/measuring-the-time-an-application-was-stopped-due-to-garbage-collection/

+1

sai dove sono i documenti per questi argomenti? è tempo di applicazione time wall o cpu time? – radai

+0

@radai Buona domanda - Non sono esattamente sicuro, ma cercherò di scoprirlo e aggiornare la risposta. –

1

PrintGCDetails - questa opzione potrebbe essere utile. Prepara informazioni su ogni raccolta di rifiuti.

[GC 
[PSYoungGen: 99952K->14688K(109312K)] 
422212K->341136K(764672K), 0.0631991 secs] 
[Times: user=0.83 sys=0.00, real=0.06 secs] 

Pprovides utilizzo della CPU e le informazioni sul tempo trascorso. Il valore per il diritto utente di è il tempo di CPU utilizzato dalla garbage collection che esegue le istruzioni al di fuori del sistema operativo. In questo esempio, il garbage collector utilizza 0,06 secondi di tempo CPU utente. Il valore per il diritto di sys è il tempo della CPU utilizzato dal sistema operativo per conto di il garbage collector. In questo esempio, il garbage collector non ha utilizzato per utilizzare la CPU per eseguire le istruzioni del sistema operativo per conto di della garbage collection. Il valore a destra del reale è il tempo di orologio da parete trascorso in secondi della garbage collection. In questo esempio, ci sono voluti 0,06 secondi per completare la garbage collection.

Java Performance - un buon libro, potrebbe essere trovato nella versione digitale. Contiene un grande articolo sulla misurazione dell'impatto di GC.

+0

Grazie, sto usando 'PrintGCDetails' ma mi dice solo il tempo GC, voglio sapere la percentuale per il confronto. – Ryan

+0

Tende uno scopo molto strano, dicendo onestamente. Perché non ridurre al minimo il tempo di GC rispetto allo stesso caso di test giocando con i tipi di GC e le dimensioni di generazione. – Mikhail

0

No, il calcolo non è corretto.Quello che desidera calcolare è

(CPU spent on GC)/(total CPU spent on JVM) 

Come sottolineato negli altri commenti, la "CPU totale speso per JVM" sarà inferiore a 60 * 4, come quella assume a pieno carico del sistema dall'applicazione e non Cicli della CPU spesi dal sistema operativo o da altre applicazioni. Su linux, i comandi "time" e "ps" possono essere utilizzati per trovare il numero corretto qui.

Tuttavia, anche la "CPU spesa per GC" è difficile da individuare con il comando jstat. Sospetto che jstat riporti i tempi di wallclock (e non i tempi della CPU), che saranno inutili per il calcolo di cui sopra - di nuovo, non sai se GC ha caricato completamente tutti i core durante il periodo di tempo del wallclock. Sorprendentemente, non c'è una documentazione chiara su quale tipo di tempo (wallclock vs CPU) è riportato dal comando jstat - se mi manca, per favore lascia un commento qui.