Strumenti per monitorare l'esecuzione del thread java
Ho un'applicazione Web java in esecuzione su un server Tomcat(Linux). Nell'ambiente di produzione sto affrontando qualche problema di prestazioni. A intervalli casuali il processo jsvc su cui tomcat è in esecuzione inizia a funzionare al 90-100% della CPU. Non sono in grado di scoprire l'innesco per questo evento. Il server è un sistema quad core. Il consumo di memoria non indica alcuna anomalia.
Come posso monitorare quale thread(traccia dello stack dell'applicazione) nell'applicazione sta causando il problema?
Sono verifica con jconsole e PSI Probe , ma entrambi non forniscono alcuna informazione dettagliata su quale thread all'interno dell'applicazione sta causando l'anomalia di utilizzo della CPU.
5 answers
Un modo relativamente semplice per farlo (che può o non può funzionare per il tuo caso-dipende da quanto tempo si verifica il comportamento):
Quando la tua app mostra il comportamento che vuoi eseguire il debug (in questo caso, il 90-100% di utilizzo della CPU) usa jstack sull'ID del processo:
Http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html
Per esaminare quali thread sono in esecuzione e in quali metodi si verificano. Se lo fai un paio di volte, può essere relativamente facile da individuare il catena chiamata colpevole. Puoi quindi eseguire il debug dell'ingresso a quella catena.
Non è necessariamente il metodo migliore o più elegante, ma è molto facile da fare e potrebbe essere tutto ciò di cui hai bisogno. Inizierei da li'. È simile alla filosofia" printf è il miglior debugger che abbia mai usato".
VisualVM è quello che stai cercando. Viene fornito con JDK più recenti e consente di monitorare l'utilizzo del thread .
È possibile ottenere un dump di stacktrace per tutti i thread in qualsiasi applicazione Java inviando un segnale di CHIUSURA.
kill -QUIT [processId]
Questo verrà visualizzato nel processo' stdout.
Un altro strumento per mostrare i thread che consumano più cpu è jvmtop
Solo i miei 2 centesimi ma mi chiedo se non stai sperimentando un problema di memoria i picchi della CPU potrebbero essere l'attività GC. Quindi, mentre stai monitorando il tuo tomcat con jconsole, dai un'occhiata alla scheda memoria e controlla se l'utilizzo dell'heap non è elevato.