2010-02-11 5 views
5

Ho un Tomcat con alcune applicazioni in esecuzione. Non riesco a riavviare Tomcat ma vorrei monitorare l'utilizzo dei file di classe.È possibile effettuare il log se viene utilizzata una classe nella JVM?

Vorrei registrare se viene utilizzata una classe specifica. È possibile? Come potrei realizzarlo?

Classe Usage: Se un oggetto di questa classe viene creata un'istanza o metodi sono chiamati ecc

Precisazione: non riesco a riavviare l'applicazione. Ogni soluzione con la ricompilazione del codice in esecuzione non è accettabile. Questo rende il problema così difficile.

Remote debug/JMX non è ancora abilitato. Sarebbe uno sforzo simile come ricompilare l'applicazione per attivarlo.

La piattaforma è RHEL, 64 bit.

+3

Si prega di chiarire cosa si intende per quanto riguarda se una classe è "utilizzata". –

+0

Puoi confermare la piattaforma? –

+1

Il debug remoto, JMX o altro già impostato sull'istanza Tomcat? Se no, probabilmente sei sfortunato ... – Nate

risposta

1

Vorrei registrare se viene utilizzata una classe specificata; Ad esempio, se un oggetto per questa classe viene istanziato o vengono chiamati metodi, ecc.

Un profiler di memoria ti dirà se esiste un'istanza raggiungibile di una classe nell'istante in cui esegui il profiler. Un profiler di esecuzione potrebbe dirti che un metodo o costruttore viene chiamato durante un certo intervallo ... anche se potrebbe anche perdere una chiamata, a causa del modo in cui funzionano i profiler.

Il classloader del webapp potrebbe in teoria dirti se una classe è stata caricata, ma dubito che ci sia un modo per chiamare il metodo del classloader che non comporta un riavvio. Inoltre, non c'è modo di sapere se un metodo è mai stato chiamato o se un'istanza è mai stata creata oltre all'aggiunta di hook di monitoraggio alla classe. E l'aggiunta di questi hook comporterebbe un riavvio.

E naturalmente ci sono altri modi in cui una classe può essere "utilizzata" che non implica la costruzione di istanze o la chiamata dei suoi metodi.

Quindi, a seconda di cosa stai cercando di capire, potresti essere sfortunato.

1

Penso che sia necessario il profiling per questo. Il profiler ti permetterà di vedere quali classi sono usate. o i programmatori fav - System.out.println :)

+0

Proverò a profilare, ma non sono sicuro che funzioni. – guerda

+1

Penso che la profilazione richiede le impostazioni sulla JVM che richiedono un riavvio da applicare. –

0

Se si ha accesso ai file di origine, è sufficiente inserire alcune istruzioni di registro nel costruttore della classe (presupponendo che l'istanza implichi l'uso della classe).

Se l'istanziazione dell'oggetto non è ciò che intendi per "l'uso di file di classe", allora forse vuoi dire che vorresti sapere quando una classe viene caricata dalla JVM? Se è così, static initialization blocks potrebbe essere in grado di aiutare; potresti mettere le dichiarazioni del registro lì.

+1

se non riesce a riavviare Tomcat, probabilmente non può aggiornare il codice dell'applicazione. – Thilo

+0

Non suona così sicuro. Mi sembra di ricordare di inserire .jar nella directory di Tomcat per la distribuzione dinamica. –

+0

Non sono sicuro, perché l'OP non è chiaro nelle sue esigenze. Se il riavvio di Tomcat è disattivato, è probabile che anche la ridistribuzione a caldo sia proibita (come probabilmente aggiornando l'origine in primo luogo). – Thilo

0

Se vuoi conoscerlo a livello programmatico, allora non penso che sia banalmente possibile.

Ma si può fare qualche riflessione per conoscere, chiamando questo metodo.

ClassLoader#findLoadedClass() 

Se il metodo restituisce null, significa che la classe non viene caricato e quindi non in uso. Il problema, ovviamente, è che il metodo è protetto, quindi è necessario utilizzare la riflessione.

-1

È possibile definire un blocco statico nella classe

class X { 
static { 
    System.out.println("class X has been loaded"); 
} 
... 
} 

che sarà chiamata una volta quando l'oggetto classe viene caricata.

Se non è possibile modificare il codice, e si dispone di un JRE 6, si potrebbe provare lo strumento jmap

jmap -histo <pid> 

stamperà un istogramma del mucchio, tra cui tutte le classi caricate.

Usando jps si può scoprire il PID

+0

Bella idea. Per il mio problema, non funzionerà perché non riesco a ricompilare l'applicazione. – guerda

0

Se siete su Solaris o OS X, poi una sonda di DTrace potrebbe in opzione.

Oltre a ciò, se non è possibile collegare un debugger o un profiler o un altro strumento di monitoraggio alla JVM già in esecuzione (che dipende dalle opzioni che avresti dovuto specificare all'avvio), sei sfortunato.

+0

Anche Solaris ha anche 'pfiles' o' truss'. –

-1

Con JRockit JVM è possibile avviare l'applicazione con -Xverbose: class = info per ottenere informazioni sul caricamento della classe.

+0

Anche la JVM di Sun supporta questo flag. – Thilo

Problemi correlati