2011-01-27 8 views
18

Deseo perfilar una aplicación Java sin detener la aplicación. ¿Puedo agregar un Javaagent de alguna manera mientras la aplicación se está ejecutando?¿Cómo puedo agregar un Javaagent a una JVM sin detener la JVM?

+0

Las veces que deseé poder conectar el depurador en la producción ... – omerkudat

+0

@omerkudat :) ouchy. Luego ejecútelo con la opción del depurador, no verá ningún inconveniente de rendimiento real, pero los depuradores pueden causar filtraciones – bestsss

+0

¿La opción del depurador me permite agregar un javaagent en el tiempo de ejecución? – Zubair

Respuesta

4

Debe ser posible de acuerdo con la documentación del paquete java.lang.instrument.

Agentes de arrancar Después virtual de inicio

Una implementación pueden proporcionar un mecanismo para iniciar agentes en algún momento después de la la máquina virtual ha comenzado. Los detalles sobre cómo se inicia esto son específicos de la implementación pero normalmente la aplicación ya ha comenzado y su método principal tiene ya se ha invocado. En los casos en que una aplicación es compatible con los de partida de los agentes después de que la máquina virtual tiene comenzó aplica lo siguiente:

1. El manifiesto del JAR agente debe contener el atributo Agente-Class. El valor de este atributo es el nombre de la clase del agente .
2. La clase de agente debe implementar un agente estático público principal en el método .
3. El cargador de clases del sistema (ClassLoader.getSystemClassLoader) debe admitir un mecanismo para agregar un agente archivo JAR a la ruta de la clase del sistema.

pero nunca lo he intentado: - |

+0

"puede proporcionar" :-(Aunque suena divertido :) –

21

Ver Starting a Java agent after program start.

Se vincula a http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ que bajo "carga dinámica de un javaagent en tiempo de ejecución" proporciona ejemplo de trabajo:

public static void loadAgent() throws Exception { 
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName(); 
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@')); 
    VirtualMachine vm = VirtualMachine.attach(pid); 
    vm.loadAgent(jarFilePath, ""); 
    vm.detach(); 
} 

Nota que Java 9 requiere -Djdk.attach.allowAttachSelf=true estar presente entre los argumentos de inicio de JVM.

14

Puede utilizar ea-agent-loader

Con él la carga de un agente en tiempo de ejecución se verá así:

public class HelloAgentWorld 
{ 
    public static class HelloAgent 
    { 
     public static void agentmain(String agentArgs, Instrumentation inst) 
     { 
      System.out.println(agentArgs); 
      System.out.println("Hi from the agent!"); 
      System.out.println("I've got instrumentation!: " + inst); 
     } 
    } 

    public static void main(String[] args) 
    { 
     AgentLoader.loadAgentClass(HelloAgent.class.getName(), "Hello!"); 
    } 
} 
+0

Revisé el ea-agent-loader, que se ve bastante bien. Lamentablemente, no funciona para mí: https://stackoverflow.com/questions/48678557/how-to-start-aspectj-loadtime-weaver-agent-without-restarting-jvm-how-to-start y aquí https://github.com/electronicarts/ea-agent-loader/issues/9 – cilap