2010-11-12 6 views
5

Ho un'applicazione multithread che ha una buona scalabilità all'inizio, ma in esecuzione su un server 16-cpu, una volta superato 5 o 6 thread hardware le prestazioni si disattivano. I sospetto che il collo di bottiglia circonda uno dei metodi sincronizzati. Tuttavia, devo essere sicuro che sia il metodo colpevole prima di iniziare a immergermi nel codice e provare a sostituire l'algoritmo con uno non bloccante.Profiling Java: scopri dove i thread trascorrono del tempo bloccati

esecuzione Java con l'argomento -Xprof mi dice che, come mi aspettavo, i fili stanno spendendo la maggior parte del loro tempo bloccati. C'è un modo in cui posso suddividerlo in quanto tempo spendono bloccato con un particolare metodo?

risposta

1

http://yourkit.com la vista del monitor indica quali classi di blocco sono attive, chi detiene i blocchi contesi e la suddivisione per istanza di blocco e stack chiamante. Esiste un periodo di valutazione di 30 giorni dello strumento.

1

Lo strumento jvisualvm fornito con JDK può essere di aiuto, anche se le informazioni di profilazione della CPU sono piuttosto limitate (più di un visualizzatore per i dati Xprof). In genere trovo più utile per il profiling della memoria.

JProfiler ha un profiler CPU piuttosto carino con alcune funzionalità davvero interessanti che potrebbero aiutarti, ma è commerciale.

Oppure, è possibile aggiungere la raccolta di statistiche al codice (ad esempio, misurare il tempo necessario per eseguire ogni metodo sincronizzato che si sospetta, interrompendolo nel tempo in attesa della sincronizzazione/esecuzione del metodo), anche se è molto di più lavoro.

1

Provare this method? Se funziona su più CPU dovrebbe trovare il problema, ma questo è un grande "se".

Fondamentalmente, quando vedi che un thread è bloccato, lo stack di chiamate ti dice esattamente perché. Se non sei sicuro di vedere il vero problema, fallo alcune volte.

0

Eclipse TPTP è un altro profiler molto buono e gratuito.