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?
Respuesta
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: - |
"puede proporcionar" :-(Aunque suena divertido :) –
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.
Aquí una biblioteca que inicializa aspectj y primavera-aspectos en tiempo de ejecución por inyección de instrumentación: https://github.com/subes/invesdwin-instrument
Usted puede usarlo como una muestra más elaborada.
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!");
}
}
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
- 1. ¿Cómo bloqueas una JVM?
- 2. ¿Puedo agregar un nuevo certificado al almacén de claves sin reiniciar la JVM?
- 3. JVM sin recolección de basura
- 4. ¿Cómo probar un ClassFileTransformer/javaagent?
- 5. ¿Cómo crear una JVM personalizada?
- 6. agregar opciones de jvm en tomcat
- 7. Compilador Lua a JVM?
- 8. ¿Cómo se diferencian las "JVM modernas" de las JVM antiguas?
- 9. JVM devolviendo memoria a OS
- 10. cómo bifurcar JVM?
- 11. ¿Cómo implementan JVM IdentityHashMap?
- 12. Enviando señales a una JVM en ejecución
- 13. Enviar una señal POSIX desde la JVM
- 14. ¿Cuál es la diferencia entre JVM Spec, implementación JVM, JVM en tiempo de ejecución
- 15. ¿Cómo comienza JVM a buscar clases?
- 16. ¿Cómo puedo examinar el bytecode JVM para una función clojure?
- 17. ¿Qué es una instrucción JVM?
- 18. lsof contraparte para una JVM?
- 19. Erlang en una JVM/CLR
- 20. ¿Cómo obtener un identificador de JVM único?
- 21. Ehcache multiple JVM - opensource?
- 22. Cómo establecer correctamente una JVM TimeZone
- 23. ¿Es OpenJDK JVM lo mismo que Oracle Java SE JVM?
- 24. ¿Cómo hacer un lenguaje .Net o JVM?
- 25. JVM getObjectSize example
- 26. Configuración de Eclipse JVM
- 27. Ejecución de varias JVM
- 28. ¿Está la asignación de memoria en el JVM sin cerradura
- 29. Pasar un archivo completo a argumentos de JVM
- 30. Traducción de código Python a JVM
Las veces que deseé poder conectar el depurador en la producción ... – omerkudat
@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
¿La opción del depurador me permite agregar un javaagent en el tiempo de ejecución? – Zubair