Se hai un'applicazione Java che consuma CPU quando non sta facendo nulla, come determini cosa sta facendo?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Domanda

Sto chiamando l'API Java di un fornitore e su alcuni server sembra che la JVM entri in un ciclo di polling a bassa priorità dopo aver effettuato l'accesso all'API (CPU al 100% di utilizzo).La stessa app su altri server non presenta questo comportamento.Ciò accade su WebSphere e Tomcat.L'ambiente è complicato da configurare, quindi è difficile provare a fare qualcosa come la profilazione all'interno di Eclipse.

Esiste un modo per profilare (o qualche altro metodo di ispezione) un'app Java esistente in esecuzione in Tomcat per scoprire quali metodi vengono eseguiti mentre si trova in questo tipo di stato di spinwait?L'app esegue solo un metodo quando si trova in questo stato (metodo del fornitore).Il fornitore non può replicare il comportamento (ovviamente).


Aggiornamento:

Utilizzando JConsole sono stato in grado di determinare chi stava correndo e cosa stava facendo.Mi ci sono volute alcune ore per capire perché lo stava facendo.Il problema alla fine era che il jar API del fornitore utilizzato non corrispondeva esattamente alla configurazione del database utilizzato.Per impostazione predefinita, la traccia e il monitoraggio delle prestazioni erano abilitati sui server che presentavano una leggera mancata corrispondenza nella configurazione.Ho usato un barattolo diverso e tutto è andato bene.

Quindi grazie, Joshua, per la tua risposta.JConsole era estremamente facile da configurare e utilizzare per monitorare un'applicazione esistente.

@Cringe: ho sperimentato alcune delle opzioni che hai suggerito.Ho avuto alcuni problemi con la configurazione di JProfiler, sembra buono (ma costoso).Andando avanti sono andato avanti e ho aggiunto il plug-in Eclipse Profiler e esaminerò i diversi profiler open source per confrontare le funzionalità.

È stato utile?

Soluzione

Se utilizzi Java 5 o versioni successive, puoi connetterti alla tua applicazione utilizzando jconsole per visualizzare tutti i thread in esecuzione.jstack eseguirà anche un dump dello stack.Penso che dovrebbe funzionare ancora anche all'interno di un contenitore come Tomcat.

Entrambi questi strumenti sono inclusi con JDK5 e versioni successive (presumo che il processo debba essere almeno Java 5, anche se potrei sbagliarmi)

Aggiornamento:Vale anche la pena notare che a partire da JDK 1.6 aggiornamento 7 ora è disponibile un profiler in bundle chiamato VisualVM che può essere avviato con 'jvisualvm'.Sembra che sia un progetto java.net, quindi ulteriori informazioni potrebbero essere disponibili in quella pagina.Non l'ho ancora usato, ma sembra utile per analisi più serie.

Spero possa aiutare

Altri suggerimenti

Di fronte allo stesso problema che ho usato Profilo YourKit.Il suo caricatore non si attiva a meno che non ti connetti effettivamente ad esso (sebbene apra una porta per ascoltare le connessioni).Il profiler stesso ha una bella "quantità di tempo spesa in ciascun metodo" mentre lavora nella sua modalità meno invadente.

Un altro modo è rilevare il carico della CPU (tramite JNI, quindi avresti bisogno di una libreria esterna per questo) in un thread "watchdog" con la massima priorità e iniziare a registrare tutti i thread quando la CPU è sufficientemente alta per un tempo sufficientemente lungo.Potresti trovare Questo articolo illuminante.

Se è per scopi professionali e hai dei soldi da spendere, prova a metterci le mani sopra JProfiler.Se vuoi solo ottenere alcuni spunti, prova il Plug-in del profilatore Eclipse.L'ho usato più volte, ma non conosco lo stato attuale.

È disponibile anche un nuovo (?) progetto dal progetto Eclipse stesso: http://www.eclipse.org/tptp/ (Vedere Questo articolo).Non l'ho mai usato quindi non so dire se ne valga la pena.

C'è anche un ottimo elenco di profiler open source disponibile su http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Analizzatore di latenza del controllo missione JRockit.

L'analizzatore di latenza fornito con JRockit mostra cosa sta "facendo" la JVM quando non sta facendo nulla.Nell'ultima versione puoi vedere le latenze per:

  • Java attende/bloccato/sospensione/parcheggiato.
  • I/O file
  • I/O di rete
  • Allocazione della memoria
  • GC fa una pausa
  • Latenza JVM, ad esempio generazione di codice e caricamento di classi
  • Sospensione del filo

Lo strumento ti fornirà l'analisi dello stack quando si è verificata la latenza.È possibile visualizzare i dati di latenza in molti modi diversi (tracce aggregate, come istogramma, in un grafico a thread ecc.).Lo strumento ti consente anche di vedere le transizioni tra i thread, ad esempio quando un thread ne notifica un altro.

analizzatore di latenza http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

Il sovraccarico è trascurabile e, a differenza di molti altri strumenti, può essere utilizzato in un ambiente di produzione.Questo post sul blog ti dà una breve introduzione e il programma può essere scaricato Qui.

È gratuito da utilizzare per lo sviluppo!

Se JConsole non può essere utilizzato, puoi farlo

  • premere CTRL+ROTTURA sotto Windows
  • Inviare kill -3 <process id> sotto Linux

per ottenere un thread dump completo.Ciò non influisce sulle prestazioni e può sempre essere eseguito in produzione.

Usa un profiler. Sì, costano denaro e usarli a volte può essere un po' imbarazzante, ma forniscono molte più prove reali piuttosto che congetture.

Gli esseri umani sono universalmente incapaci di indovinare dove si trovano i colli di bottiglia nelle prestazioni.Sembra semplicemente che sia qualcosa per cui il nostro cervello non è costruito molto bene.Può sembrare ovvio, potresti avere grandi idee su quale sia il problema, ma il mondo reale spesso si rivela fare qualcosa di diverso.E ottimizzare la parte sbagliata del codice significa, nella migliore delle ipotesi, molto lavoro per un beneficio minimo.Più spesso rallenta le cose e talvolta le rompe completamente.Quindi, prima di apportare qualsiasi modifica per motivi di ottimizzazione, dovresti Sempre avere prove reali da un profiler o da un altro strumento accurato.

Come accennato, sia JProfiler che YourKit sono entrambi abbastanza buoni e non eccessivamente costosi.L'ultima volta che ho guardato, entrambi avevano anche demo gratuite.

Per completezza:anche se la mia azienda si standardizza più o meno su Eclipse, utilizziamo Netbeans (6 e versioni successive) con il suo incluso, profiler gratuito su base giornaliera.Funziona meglio del plugin Eclipse TPTP (controllato l'ultima volta 3 mesi fa) e per noi elimina qualsiasi necessità di un profiler commerciale come JProfiler, che è eccellente, ma sta diventando rapidamente inutile.

VisualVM dovrebbe essere il profiler di netbeans come autonomo.Ho provato TPTP per Eclipse ma visualVm sembra un'opzione molto più interessante!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top