2014-06-25 18 views
5

Vorremmo interiorizzare alcune delle funzionalità di JConsole/JVisualVM e raccogliere dati sull'utilizzo della cpu e il consumo di memoria dall'applicazione in esecuzione. Il motivo è che i vincoli di sicurezza ci impediscono di aprire le porte jmx all'esterno su un sistema di produzione.Come determinare l'utilizzo di gc-cpu in un'applicazione?

La maggior parte dei dati richiesti può essere monitorata tramite MXBeans, tuttavia, la quantità di dati utilizzata per la garbage collection non ci sfugge. Il monitoraggio di gc-time tramite GarbageCollectorMXBean non è utile, in quanto fornisce solo il walltime dei collettori di lavoro paralleli.

Suppongo che sarebbe possibile utilizzare ThreadMXBean per determinare il tempo di elaborazione di tutti i thread gc. Non vedo alcun modo per identificare in modo sicuro quei thread.

Qualcuno sa, come JVisualVM calcola quel numero?

risposta

2

Qualche tempo fa ho scritto un riepilogo sull'API di diagnostica JVM, è disponibile here.

In breve, MBean e "contatori pref" sono la principale fonte di autodiagnosi JVM.

JVisualVM utilizza GarbageCollectorMXBean l'interpretazione del tempo dell'orologio a muro come tempo della CPU (cioè senza senso).

ThreadMXBean non include il thread GC è l'elenco di thread quindi è inutile anche. Nello strumento SJK stavo sottraendo il tempo di CPU cumulativo di tutti i thread dell'applicazione dal tempo della CPU del processo. Questo approccio non è preciso, ma meglio di niente.

I "contatori Perf" contengono informazioni accurate sull'utilizzo della CPU per GC. "Contatori Perf" è possibile accedere tramite sun.management.counter.perf.PerfInstrumentation.

Here è possibile trovare un esempio (test JUnit) di "contatori perf" dell'host JVM.

Sono necessari i contatori sun.gc.collector.0.time e sun.gc.collector.1.time che misurano l'utilizzo cumulativo della CPU per GC giovani e vecchi/completi (prendere nota che hanno segnalato in tick).

Problemi correlati