Como faço para conectar-me a uma ferramenta de linha de comando Java com o YourKit Java Profiler?

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

Pergunta

Construí uma ferramenta de linha de comando em Java, que eu gostaria de fazer um perfil com o YourKit. Eu inicio a ferramenta de linha de comando com algo como:

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

Ele é concluído em menos de 2 segundos.

Depois de ler http://www.yourkit.com/docs/80/help/agent.jsp, Eu tentei o seguinte:

$ 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 eu entendo:

[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 então a ferramenta é executada até a conclusão e saídas.)

Eu acho que (por padrão, pelo menos) seu kit foi projetado para conectar apenas ao aplicativo em execução.

Como devo modificar minha ferramenta de linha de comando para permitir a conexão do seu kit?

  1. Eu poderia adicionar uma opção de linha de comando que a fará uma pausa para entrada e não pressionarei o retorno para continuar até que eu o conecte a partir do seu kit.
  2. Existe uma API do YourKit que eu poderia adicionar à minha ferramenta que causaria bloquear até que eu me conecte com o YourKit?
  3. Existe uma API YourKit ou uma opção de linha de comando Java que criaria um "instantâneo" de perfil que eu poderia carregar e analisar posteriormente (depois que a ferramenta de linha de comando concluir) com o YourKit?
Foi útil?

Solução

Não há como pausar a aplicação perfilada até que o Profiler "se conecte"; Você simplesmente não precisa fazer isso.

Em vez disso, faça o seguinte:

  • Ligue os modos de perfil desejados da startup. Por exemplo, se você precisar perfilar o uso da CPU, inicie a amostragem da CPU ou o rastreamento da CPU com as opções de inicialização correspondentes "amostragem" ou "rastreamento". Ver http://www.yourkit.com/docs/80/help/additional_agent_options.jsp

  • Se o aplicativo perfilado for de curta duração, ative a captura de instantâneos na saída com a opção de inicialização "Onexit = Snapshot". Posteriormente, o Open capturou o instantâneo na interface do usuário do Profiler para análise.

Outras dicas

Não estou ciente de uma opção de YourKit para fazer isso (o que não quer dizer que não exista), mas aí é Uma opção de remoção remota de Java para fazer isso.

Tente adicionar o seguinte à sua linha de comando, além das opções do agente do YourKit:

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

Isso deve fazer com que a VM suspenda assim que iniciar, esperando que um depurador se conecte na porta 8000. Seu próprio kit não é um depurador, mas um IDE como o Eclipse ou o NetBean fará o trabalho, assim como o básico JDB linha de comando.

Portanto, execute o comando, com as duas opções definidas, conecte o seukit e use um depurador para se conectar à porta de depuração, que acionará a VM para continuar a execução, permitindo que o seu kit obtenha os dados necessários.

Seria melhor fazer isso tudo usando o seu kit, mas não conheço tal maneira.

Você pode iniciá -lo via Eclipse, que possui um plug -in YourKit que é lançado no lançamento do aplicativo.

A opção Onexit = Snapshot do YourKit salva um arquivo instantâneo em $ home/snapshots na saída da JVM. Você pode carregar esse instantâneo na GUI YourKit para análise posterior. Ver esta página em seu site para obter mais detalhes.

A resposta para o número 3 é sim, há uma API que você pode usar para que seu aplicativo produza resultados de perfil que seu kit possa examinar.

Dê uma olhada no API Docs, e também o Ferramenta de linha de comando para controlar o perfil

Aqui está um exemplo de uso da API (eu não tentei este código):

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top