Recentemente abbiamo iniziato a testare la nostra applicazione (un server di chat basato su XMPP) utilizzando YJP 11.0.9. Durante il nostro test abbiamo notato un comportamento strano.Perché park/unpark ha un utilizzo della CPU del 60%?
- Il campionamento mostra sun.misc.Unsafe.unpark (Object) ha occupato il 60% della CPU.
- Per la stessa applicazione Traccia mostra che LockSupport.park (Object) ha preso il 52% della CPU.
Ho eseguito più test per confermare i risultati e ogni volta ho ottenuto risultati simili.
Non riesco a capire perché unpark debba impiegare il 60% di tempo e perché la traccia mostra risultati esattamente opposti.
Qualcuno può aiutarmi a capire questi risultati. Mi sto perdendo qualcosa qui?
Ambiente:
java -version java version "1.6.0_31" Java(TM) SE Runtime Environment (build 1.6.0_31-b04) Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
Potrebbe richiedere molto se chiamare "unpark' è praticamente l'unica cosa che il thread fa. Cosa intendi per "tracciamento che mostra risultati esattamente opposti"? Il tracciamento forse misura il tempo trascorso all'interno di un metodo? 'park' è un metodo di blocco, quindi non ci si può meravigliare del tempo al suo interno. –
Il thread @MarkoTopolnik esegue anche altre operazioni. Fondamentalmente il suo problema produttore/consumatore. Produrre attività di produzione e inviarla nella coda e avvisare i consumatori in attesa. Il consumatore agisce sull'attività e se non ci sono attività disponibili che parcheggiare. –
Il thread che chiama 'unpark' non è il thread che non viene parcheggiato. Quel thread, a sua volta, potrebbe davvero fare solo un piccolo lavoro oltre a rimuovere i thread di consumo appropriati. Per quanto riguarda il tempo di CPU di 'park', è un) difficile da misurare a causa del blocco e b) irrilevante dal momento che sarà una frazione insignificante del tempo effettivo trascorso nello stato parcheggiato. –