2011-08-26 12 views
6

Voglio filtrare quali classi sono state create in cpu in Java VisualVm (versione 1.7.0 b110325). Per questo, ho provato in Profiler -> Impostazioni -> Impostazioni CPU per impostare "Solo classi del profilo" al mio pacchetto sotto test, che non ha avuto alcun effetto. Poi ho cercato di sbarazzarmi di tutte le classi java. * E sun. * Impostandole in "Do not profile classes", che non ha avuto alcun effetto.Il filtraggio delle classi per la profilazione della cpu funziona in Java VisualVM?

È semplicemente un errore? O mi sta sfuggendo qualcosa? C'è una soluzione? Voglio dire altro che:

Voglio farlo principalmente per ottenere percentuali a metà strada corrette della CPU consumata per metodo. Per questo, ho bisogno di liberarmi delle misurazioni fastidiose, ad es. per sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() (circa il 70%). Molti utenti sembrano avere questo problema, vedi ad es.

+0

È il tuo scopo eseguire il codice il più velocemente possibile? o solo per ottenere delle percentuali, indipendentemente da cosa significano? Il "tempo", come è comunemente usato, è altamente ambiguo. –

+0

Sì, il mio obiettivo principale è rendere il codice più veloce. Vorrei anche avere una stima su quanto del codice dovrebbe cambiare. Quindi voglio avere una panoramica generale di tutti i punti caldi e della loro gravità. Penso che i risultati di VisualVm sarebbero accettabili per questo nonostante l'uso del tempo di parete - se solo quelle poche sole. * E java. * Classi non rovinerebbero tutte le statistiche. – DaveFar

risposta

10

Il motivo per cui si visualizza sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() nel profilo è che è stata selezionata l'opzione Profilo nuovo Runnables selezionato.

Inoltre, se hai scattato un'istantanea della sessione di profilazione, potresti visualizzare l'intero callstack per qualsiasi metodo di hotspot: in questo modo puoi passare dal metodo run() ai metodi di logica dell'applicazione, filtrando il rumore generato dall'opzione Profilo nuovo Runnables.

+0

Grazie JB (+5), controllerò l'opzione il lunedì - sembra la soluzione :) Ho fatto un'istantanea, che mi ha dato la vista Albero delle chiamate, il che non va bene dato che solo la vista Profiler mi dà le percentuali di CPU consumata per metodo. A causa della ricorsione, il mio callstack è troppo complesso per ottenere informazioni sensibili sulle prestazioni da esso. – DaveFar

+0

Grazie a JB, la disattivazione dell'opzione "Profile new Runnables" ha funzionato. – DaveFar

+2

Si prega di essere consapevoli delle conseguenze della disattivazione dell'opzione di cui sopra. Con l'opzione attivata, otterrai automaticamente informazioni su tutti i nuovi thread/runnew avviati. Con questa opzione disattivata devi essere sicuro di fornire un elenco completo dei metodi di root. –

0

OK, poiché il tuo obiettivo è far funzionare il codice il più velocemente possibile, lasciami suggerire come farlo. Non sono esperto di VisualVM, ma posso dirti cosa funziona. (Solo pochi profiler in realtà ti dicono che cosa avete bisogno di sapere, che è - che le linee del codice sono nella pila una frazione sano di tempo orologio a muro.)

L'unica misura che io abbia mai fastidio con è qualche cronometro sul tempo complessivo, o in alternativa, se il codice ha qualcosa come un framerate, il numero di fotogrammi al secondo. Non ho bisogno di alcun tipo di ulteriore interruzione di precisione, perché è nel migliore dei casi un indizio a distanza di quanto è tempo di perdere (e più spesso del tutto irrilevante), quando c'è un modo molto diretto per individuarlo.

Se non si desidera eseguire random-pausing, dipende da voi, ma ha dimostrato di funzionare, e here's an example of a 43x speedup.

Fondamentalmente, l'idea è di ottenere un (piccolo, come 10) numero di campioni di stack, presi a intervalli casuali dell'orologio. Ogni campione è costituito (ovviamente) da un elenco di siti di chiamata e, eventualmente, da un sito non di chiamata alla fine. (Se il campione è durante I/O o sospensione, terminerà con la chiamata di sistema, che va bene. Questo è quello che vuoi sapere.)

Se c'è un modo per velocizzare il tuo codice (e c'è quasi certamente), la vedrai come una linea di codice che appare su almeno uno dei campioni di pila. La probabilità che apparirà su un singolo campione è esattamente la stessa della frazione di tempo che usa. Quindi, se c'è un sito di chiamata o un'altra linea di codice che utilizza una buona quantità di tempo e si può evitare di eseguirlo, il tempo complessivo diminuirà di quella frazione.

Non conosco tutti i profiler, ma uno lo so che può dirvi che è Zoom. Altri potrebbero riuscire a farlo. Possono essere più spiffy, ma non funzionano più velocemente o meglio del metodo manuale quando lo scopo è massimizzare le prestazioni.

+0

Si prega di notare che in JVM potrebbe accadere che un metodo non venga mai visualizzato nello stack trace anche se eseguito abbastanza frequentemente. La ragione di ciò è il modo in cui la JVM consente di prendere le tracce dello stack: una traccia dello stack di un thread può essere presa solo sul checkpoint che potrebbe non essere inserito da JIT in ogni singolo metodo. –

+0

Sei un po 'l'evangelista a pausa casuale, Mike :) Grazie comunque per la risposta, l'avrei svalutato se non avessi già fornito un link per descriverti quella tecnica. L'ho provato, ma a causa della ricorsione, il callstack è piuttosto complesso. Una vista profilo la suddivide in metodi con una percentuale di runtime, quindi gli hot spot sono molto più facili da vedere. In secondo luogo, la vista profilo mostra tutti i punti caldi e la loro gravità. Ciò fornisce una buona panoramica di cosa e quanto tuning deve essere fatto. Sei d'accordo? – DaveFar

+0

@DaveBall: non si tratta di hotspot e misurazione. Sì, lo stack delle chiamate è complesso e c'è una ricorsione. Anche così, vedi se riesci a selezionarlo tutto e copiarlo su un editor. Quindi studia e vedi se riesci a rispondere alla semplice domanda "Che cosa è in corso in quel momento e perché lo sta facendo?" Quindi fallo ancora alcune volte. Questo ti mostrerà perché sta passando il tempo e ti mostrerà su cosa concentrarti. Non essere intimorito dalla ricorsione o da una pila complessa. Qualsiasi linea di codice che vedi su 2 campioni su 3 ti costa (2 + 1)/(3 + 2) = 60% in media. Buona caccia. –

Problemi correlati