2010-06-01 6 views
14

Ho un grande programma in Java che utilizza il multithreading. In alcuni casi, il programma inizia a utilizzare il 100% dei tre core del mio sistema a otto core. Nell'uso normale, il programma usa tutti i core all'1-2%. Come posso trovare la classe che sta sovraccaricando i core?Come trovare una classe ad alta intensità di CPU in Java?

+2

In generale, una classe non sta sovraccaricando la macchina, potrebbe essere un metodo particolare. – Uri

risposta

1

Provare a eseguire il dump dei thread (vedere jps, comandi jstack) e quindi vedere quali metodi vengono eseguiti.

+0

Basta osservare quali metodi vengono eseguiti più frequentemente non è lo stesso che scoprire dove il programma impiega la maggior parte del tempo di elaborazione. – Jesper

+0

@Jesper: esegui un numero di volte pari a 10, quindi cerca le istruzioni che si trovano su più campioni di stack. Quindi la frazione di campioni che contiene una linea è la frazione di tempo di cui quella linea è responsabile, e non sarebbe spesa, ma per quella linea. Il concetto di "dove il programma trascorre il suo tempo" ignora la responsabilità delle chiamate al metodo che fanno passare il tempo a livelli inferiori. –

+0

@Mike Il mio punto è che dovresti misurare quanto tempo è trascorso in quali parti del programma, non solo quante volte vengono chiamati i metodi. Potresti avere un metodo chiamato 1000 volte ma che usa solo il 10% delle volte, o un metodo che viene chiamato 100 volte ma che usa il 90% del tempo del programma. Per ottimizzare, dovresti concentrarti sul metodo meno frequentemente chiamato in questo caso. – Jesper

15

Utilizzare un profiler come il jvisualvm si raggruppamento con jdk-1.6.0_10

+2

Puoi cercare il loop di attesa occupato : '(while! done) {}'. Raramente un thread scritto correttamente può svolgere un lavoro significativo al 100%, in genere il calcolo viene occasionalmente bloccato dall'I/O o dalla sincronizzazione. - un buon grafico di utilizzo della CPU dovrebbe apparire leggermente ondulato. – Justin

4

usando un profiler per capire quale thread (s) utilizzano tutti i cicli di CPU, e il metodo (s) hanno sono in esecuzione.

2

Se si sta seguendo il percorso di profiler commerciale, si consiglia di utilizzare Dynatrace.

+0

Ridicolo costoso sia finanziario che in termini di spese generali. http://williamlouth.wordpress.com/2010/05/25/the-java-application-performance-management-vendor-showdown/ –

+0

Non sono sicuro di quanto sia costoso ma l'ho trovato più utile di JProbe .I percorsi puri di Dynatrace sono molto accurati e interrompono i report in modo appropriato a livello di metodo, livello sql, livello API. È possibile utilizzare il profiler del client per vedere l'esecuzione dello script java, i tempi delle chiamate ajax, i tempi di rendering, i tempi di rete. Sono sicuro che probabilmente ha un prezzo. Ecco perché ho detto che se l'OP sta spendendo i soldi per ottenere uno spot, potrebbe controllarlo. – CoolBeans

1

Se si utilizza Java su UNIX o alcune versioni di Linux in DTrace con Java.

+0

In realtà le sonde dtrace per la JVM sono piuttosto costose in fase di esecuzione. Sonde OpenCore vs sonde Java DTrace http://opencore.jinspired.com/?page_id=190 –

6

La soluzione migliore è quella di utilizzare un profiler - questo è quello che sono costruiti per, e c'è un grande in bundle con Java 6.

Altro (lungi dall'essere come ideale una soluzione) è quello di eseguire il programma nell'IDE di Eclipse (se è quello che si usa) in modalità di debug. Puoi quindi guardare i thread in esecuzione. SE molti di loro sono sospesi, quello che non è potrebbe essere il tuo colpevole. Forza l'interruzione (dalla barra degli strumenti) e puoi vedere dove si trova. Ci sono molte possibilità che troverai un ciclo chiaro o occupato in attesa.

Problemi correlati