2011-12-28 9 views
10

Stavo profilando la mia applicazione usando JProfiler e come risultato, nella sezione "Visualizzazioni CPU" mostra che oltre il 40% del tempo di CPU è speso per Object.wait(). Comunque per quanto ne so su Object.wait() la CPU non è data al thread in attesa.Utilizzo CPU e Object.wait

Qualcuno potrebbe aiutare a capire cosa sta succedendo e perché il profiler mostra che gran parte della CPU viene spesa per Object.wait()?

+0

Stai utilizzando più thread o solo uno? questa è un'applicazione GUI o un server? – Kylar

+0

È un'applicazione non GUI che contiene molti thread, da 40 a 60 thread. Alcuni thread sono in attesa di I/O di rete e altri sono in attesa di rispondere alle richieste che ricevono tramite I/O. – Faramarz

risposta

6

Il profiler non sa che la CPU è inattiva mentre è in wait(). Tutto ciò che il profiler sa è che è stato inserito wait() e dopo alcuni millisecondi è tornato. Quindi, se quei millisecondi tendono a richiedere il 40% del tempo di esecuzione, ce l'hai.

+0

Dipende dal profiler. Ad esempio, YourKit è sicuramente in grado di misurare il tempo della CPU: http://www.yourkit.com/docs/10/help/times.jsp –

+0

@EliAcherkan Sì, e non so per certo che jprofiler non lo sappia; ma non c'è altra spiegazione. L'unica altra cosa che potrei speculare è che se si ha un thread in un ciclo stretto che non fa altro che "wait()" e un altro thread in un ciclo stretto che non fa altro che "notify()" allora suppongo che sia probabile che "aspetta"() 'consumerebbe infatti una grande percentuale della CPU, non perché sia ​​costosa di per sé, ma perché non faremmo davvero altro. Ma è altamente improbabile. –

2

40% di cosa? Si supponga di profilo il seguente codice:

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

Se si guarda solo al tempo della CPU (non il tempo orologio a muro), la quasi totalità di esso sarà in sleep.

Perché? Poiché utilizza pochissimo tempo di CPU, ma del tempo di CPU, è, tutto viene speso per entrare e uscire da sleep.

Naturalmente, se si guarda l'ora dell'orologio a muro, anche più di esso sarà in sleep.

Lo stesso vale per qualsiasi chiamata di blocco, ad esempio wait.

+0

Grazie a tutti. Proverò un altro profiler come YourKit per vedere cosa mi dice. – Faramarz