Análise de desempenho para uma aplicação java
Preciso de optimizar uma aplicação Java. Faz algumas chamadas de terceiros. Eu preciso de alguma boa ferramenta para medir com precisão o tempo tomado pelas chamadas API individuais. Para dar uma idéia da complexidade- a aplicação leva um arquivo de fonte de dados contendo 1 milhão de linhas, e leva cerca de uma hora para completar o processamento. Como parte do processamento, ele faz algumas chamadas de terceiros (incluindo algumas chamadas de rede). Preciso de identificar que chamadas estão a demorar mais tempo do que outras, e com base nisso, descubra uma maneira de otimizar a aplicação.
Todas as sugestões seriam apreciadas.
8 answers
Posso recomendar JVisualVM . É uma grande ferramenta de monitoramento / perfil que está junto com o Oracle/Sun JDK. Ligue-o, ligue-se à sua aplicação e inicie o perfil do CPU. Você deve obter grandes histogramas sobre onde o tempo é gasto.
Começar com o VisualVM tem um grande elenco de tela mostrando você como trabalhar com ele.
Imagem de Ecrã:
Outra alternativa mais rudimentar é ir com o {[[0]} opção da linha de comandos:
-Xprof
Traça o perfil do programa em execução, e envia os dados de análise para saída padrão. Esta opção é fornecida como um utilitário que é útil no desenvolvimento do programa e não se destina a ser utilizado em sistemas de produção.
Tenho usado o teu Kit Algumas vezes e que muito feliz com ele. No entanto, nunca perfilei uma operação de longa duração.
O processamento é o mesmo para cada linha? Nesse caso, o tamanho do arquivo de entrada realmente não importa. Você poderia traçar um perfil de um subconjunto para descobrir quais chamadas são caras.
As costuras são perfeitas para o seu estojo de uso..
Soa como um normal profiler não pode ser a ferramenta certa, neste caso, uma vez que está voltada para medir o tempo de CPU tomadas pelo programa que está sendo perfilado, ao invés de incluir externo APIs que ele chama, e eles tendem a incorrer em uma alta sobrecarga de seus próprios e recolher uma grande quantidade de dados que provavelmente iria sobrecarregar o sistema se for deixado em execução por um longo tempo.
Se você realmente precisa coletar dados de desempenho durante tanto tempo, e principalmente para chamadas externas, então Perf4J é provavelmente uma ferramenta melhor.Eu uso profiler em NetBeans (é realmente brilhante e já está incorporado, não há necessidade de instalar plugin) ou JVisualVM quando não está a usar NetBeans.