jdk - java runtime environment 1.6 0
¿Cómo puedo agregar un Javaagent a una JVM sin detener la JVM? (4)
Aquí una biblioteca que inicializa los aspectos de aspecto y primavera en el tiempo de ejecución mediante la inyección de instrumentación: https://github.com/subes/invesdwin-instrument
Puedes usarlo como una muestra más elaborada.
Deseo perfilar una aplicación Java sin detener la aplicación. ¿Puedo agregar un Javaagent de alguna manera mientras se ejecuta la aplicación?
Consulte Inicio de un agente Java después de iniciar el programa .
Enlaza con 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 un ejemplo práctico:
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();
}
Tenga en cuenta que Java 9 requiere que -Djdk.attach.allowAttachSelf=true
esté presente entre los argumentos de inicio de JVM.
Debería ser posible de acuerdo con la documentación del paquete java.lang.instrument .
Agentes de arranque después del inicio de VM
Una implementación puede proporcionar un mecanismo para iniciar agentes en algún momento después de que la VM haya iniciado. Los detalles sobre cómo se inicia esto son específicos de la implementación, pero normalmente la aplicación ya se ha iniciado y su método principal ya se ha invocado. En los casos en que una implementación admite el inicio de agentes después de que la VM haya iniciado, se aplica lo siguiente:
1. El manifiesto del agente JAR debe contener el atributo Agente-Clase. El valor de este atributo es el nombre de la clase de agente.
2. La clase de agente debe implementar un método público agentmain estático.
3. El cargador de clases del sistema (ClassLoader.getSystemClassLoader) debe admitir un mecanismo para agregar un archivo JAR de agente a la ruta de clases del sistema.
pero nunca lo he probado : - |
Puedes usar ea-agent-loader
Con ello se cargará un agente en tiempo de ejecución:
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!");
}
}