Domanda

Ho costruire uno strumento da riga di comando in Java, che vorrei ora al profilo con YourKit. Lancio lo strumento della riga di comando con qualcosa come:

$ java -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

Si corre fino al completamento in meno di 2 secondi.

Dopo aver letto http://www.yourkit.com/docs/80 /help/agent.jsp , ho provato quanto segue:

$ java -agentpath:/home/dspitzer/yjp-8.0.24/bin/linux-x86-32/libyjpagent.so -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

... e ottengo:

[YourKit Java Profiler 8.0.24] JVMTI version 3001016d; 14.3-b01; Sun Microsystems Inc.; mixed mode, sharing; Linux; 32-bit JVM
[YourKit Java Profiler 8.0.24] Profiler agent is listening on port 10001...
[YourKit Java Profiler 8.0.24] *** HINT ***: To get profiling results, connect to the application from the profiler UI
...

(e poi le piste strumento di completamento ed esce.)

Credo che (per impostazione predefinita, almeno) YourKit è progettato per solo connettersi a in esecuzione l'applicazione.

Come devo modificare il mio strumento da riga di comando per consentire la connessione da YourKit?

  1. potrei aggiungere un'opzione della riga di comando che avrà in pausa per l'input, e io non premere il ritorno per la sua continuare fino a quando ho collegato ad esso da YourKit.
  2. C'è un'API YourKit che ho potuto aggiungi al mio strumento che avrebbe causato lo al blocco fino a quando ho collegato con YourKit?
  3. C'è un'API YourKit o un Java opzione della riga di comando che avrebbe creare un profiling "istantanea" che ho in grado di caricare e analizzare in seguito (dopo lo strumento di riga di comando è stata completata) con YourKit?
È stato utile?

Soluzione

Non c'è modo di mettere in pausa l'applicazione profilata fino profiler "connette"; semplicemente non c'è bisogno di farlo.

Al contrario, si prega di fare quanto segue:

  • Attiva modalità di profilatura desiderati avvio. Ad esempio, se si necessità di utilizzo del profilo CPU, cominciare sia campionamento CPU o CPU tracing con corrispondenti opzioni di avvio "campionamento" o "tracing". Vedere http://www.yourkit.com/docs/80/help/additional_agent_options. jsp

  • Se l'applicazione profilato è di breve esecuzione, permette la cattura istantanea su uscita con l'opzione di avvio "OnExit = istantanea". Successivamente aperto catturato snapshot nell'interfaccia utente profiler per l'analisi.

Altri suggerimenti

io non sono a conoscenza di un'opzione di YourKit per fare questo (che non vuol dire che non ce n'è uno), ma ci è Java opzione remoto di debug per fare questo.

Prova ad aggiungere il seguente alla riga di comando, oltre alle opzioni agente YourKit:

-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

Questo dovrebbe causare la VM di sospendere, non appena si avvia, in attesa di un debugger per connettersi sulla porta 8000. YourKit per sé non è un debugger, ma un IDE come Eclipse o Netbean farà il lavoro, così come il jdb riga di comando.

Quindi, eseguire il comando, con entrambe le opzioni impostate, YourKit Connect, quindi utilizzare un debugger per connettersi alla porta di debug, che attiverà la VM di continuare l'esecuzione, permettendo YourKit per ottenere i dati necessari.

Sarebbe meglio fare tutto questo utilizzando YourKit, ma so di nessun modo.

Si potrebbe lanciarlo tramite Eclipse, che ha un YourKit plugin che lanci sul lancio app.

opzione Su uscita = snapshot di YourKit salva un file di snapshot sotto $ HOME / istantanee all'uscita JVM. È possibile caricare questa istantanea nella GUI YourKit per un'analisi successiva. Vedere questa pagina sul loro sito per maggiori dettagli.

La risposta a # 3 è sì, c'è un'API è possibile utilizzare per avere il vostro prodotto applicazione profiling risultati YourKit può quindi esaminare.

Date un'occhiata alla Documentazione API , e anche il comando per il controllo dei profili

Ecco un esempio di utilizzo delle API (non ho provato questo codice):

Controller ykController = new Controller();
ykController.enableStackTelemetry();
ykController.enableExceptionTelemetry();
ykController.startCPUProfiling(ProfilingModes.CPU_TRACING,Controller.DEFAULT_FILTERS);
ykController.startAllocationRecording(false,0,false,0);
YourMainClass.main(args);
String snapshotLocation = ykController.captureMemorySnapshot();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top