Monitoraggio di thread Java

Metodologia

I thread Java sono le componenti primarie di qualsiasi applicazione scritta in Java, perchè rappresentano i flussi di istruzioni -concorrenti- che costituiscono l'esecuzione del programma.
Le API Java non consentono tuttavia di recuperare nessuna informazione sul consumo di CPU o di risorse di comunicazione (socket e file) da parte di ciascun thread. Analogamente, non è possibile sapere il consumo di memoria imputabile ad un singolo oggetto Java (non esiste un operatore sizeof come nel C), per il fatto che la JVM è una macchina totalmente astratta, e ogni implementazione porebbe gestire la memoria in modo diverso.

Per superare queste difficolta si ricorre all'interfaccia JVMPI (JVM Profiler Interface), che definisce un protocollo di comunicazione tra la JVM e un gestore di eventi detto Profiler. Questo profiler non è altro che un modulo eseguibile, caricato sottoforma di DLL, che riceve direttamente dalla JVM degli eventi predefiniti riguardanti il funzionamento interno della macchina virtuale (qualsiasi implementazione).
In particolare è possibile ricevere notifica delle seguento situazioni:

Tali potenzialità si dimostrano pertanto risolutive e assolutamente indisapensabili per risolvere il problema del monitoraggio circoscritto ai thread Java.

Che cosa misurare

Sfruttando la semantica degli eventi comunicati dalla JVM, un Profiler può facilmente costruire un proprio database interno che, istante per istante, rifletta lo stato interno dei thread, delle classi e degli oggetti Java attivi.
Le informazioni disponibili sono:

A questi si sono anche aggiunti dei contatori di CPU, in millisecondi e in percentuale, che però presuppongono che il thread Java in questione sia mappato su un ben preciso thread nativo. Maggiori dettagli saranno trattati più avanti.