domingo, 23 de agosto de 2020

ENTENDO A FUNCIONALIDADE DO JAVA AGENT

Digamos que você tenha um aplicativo em execução em um ambiente de produção. De vez em quando, ele entra em um estado quebrado, o erro é difícil de reproduzir e você precisa de mais algumas informações do aplicativo.

Então você está se perguntando: qual a solução?

O que você poderia fazer é anexar dinamicamente algum conjunto de código ao seu aplicativo e reescrevê-lo cuidadosamente para que o código despeje informações adicionais que você pode registrar, ou então você pode despejar o estágio do aplicativo em um arquivo de texto. Java nos dá a facilidade de fazer isso usando o Java Agent. Um fato interessante sobre o Java Agent é que os criadores de perfil de aplicativo estão usando a mesma técnica no back-end para coletar informações de uso de memória, vazamento de memória e tempo de execução de métodos.

Mas o que é o Java Agent? É um tipo especial de classe que, usando a API de instrumentação Java, pode interceptar aplicativos em execução na JVM, modificando seu bytecode. Os Java Agents são extremamente poderosos e também perigosos.

Antes de mergulhar, explicarei como um Java Agent intercepta uma classe usando o exemplo HelloWorld simples.



Conforme mostrado no diagrama abaixo, Classloaders são responsáveis por carregar classes de binários para in-memory. Quando você executa o aplicativo HelloWorld compilado (HelloWorld.class), o agent pode ser visto como uma forma de interceptar o comportamento do carregador de classe no tempo de execução. Você pode pensar como o código de bytes java será reestruturado para que o agente possa adicionar o código relevante nos locais corretos. O fato interessante é que, para programas Java, a
estrutura do bytecode é muito próxima ao código-fonte do programa Java original. Portanto, embora não instrumentemos o programa Java em si, usamos uma representação muito próxima dele. Uma coisa a observar é que existem linguagens não Java que compilam em bytecode Java (como Scala, Clojure e Kotlin), o que significa que a estrutura e o formato do bytecode para programas podem ser muito diferentes.



Os Java Agents são baseados na facility, vindos da plataforma Java e o ponto de entrada para isso é um pacote de instrumentos java.lang, que fornece serviços que permitem aos agentes instrumentar programas em execução na JVM. O pacote é bastante simples e autocontido, pois contém algumas classes de exceção, uma classe de dados, a definição da classe e duas interfaces. Destes dois, só precisamos implementar a interface classFileTransformer, se quisermos escrever um Java Agent.

 Existem duas maneiras de definir um Agent:

A primeira é um agent estático, o que significa que construímos nosso agent, o empacotamos como um arquivo jar e, quando iniciamos nosso aplicativo Java, passamos um argumento JVM especial chamado javaagent. Em seguida, fornecemos a localização do jar do agente no disco e a JVM faz sua mágica.

<imagem>

Shell

$ java -javaagent:<caminho do arquivo jar do agent> -jar <caminho do arquivo jar empacotado que você deseja interceptar>

A segunda maneira é chamada de agent dinâmico.

Em vez de instrumentar a maneira como você inicia o aplicativo, o que você pode fazer é escrever um pequeno código que pega e se conecta a uma JVM existente e diz a ela para carregar um determinado agente.

 

Este foi uma dica rápida sobre a funcionalidade e aplicabilidade do Java agent. É um tema bastante extenso e que é melhor esplanado no treinamento Formação Java WEB Completa. Nele, o professor Alex Egídio vai abordar os temas de forma prática aplicando a teoria necessária para o melhor entendimento. Aproveite a promoção de 70% de desconto e comece hoje mesmo a desenvolver ou melhorar suas habilidades em Java. O treinamento mostra conceitos básicos ao avançado da linguagem Java e conta com materiais de apoio e um grupo exclusivo de alunos para tirar as dúvidas. Clicando na imagem abaixo, você pode assistir a vídeos demonstrativos do curso bem como o cronograma.



 

 

 

 

 

Nenhum comentário:

Postar um comentário

MÉTODO ESSENCIALISMO UMA FORMA DE APRENDER A PROGRAMAR EM JAVA

 O essencialismo é mais do que uma estratégia de gestão de tempo ou uma técnica de produtividade. Trata-se de um método para identificar o q...