Я хочу профилировать приложение Java, не останавливая приложение. Можно ли каким-либо образом добавить Javaagent во время работы приложения?
Как добавить Javaagent в JVM без остановки JVM?
Ответ 1
Это должно быть возможно в соответствии с документацией пакета java.lang.instrument.
Запуск агентов после запуска VM
Реализация может обеспечить механизм запуска агентов когда-нибудь после запуска виртуальной машины. подробности о том, как это инициировано являются специфическими для реализации, но обычно приложение уже начался, и его основной метод уже вызывается. В тех случаях, когда реализация поддерживает запуск агентов после VM началось следующее:
1. В манифесте агента JAR должен быть атрибут Агент-класс. Значение этого Атрибут - это имя агента класс.
2. Класс агента должен реализовывать public static agentmain метод.
3. Загрузочный загрузчик системы (ClassLoader.getSystemClassLoader) должен поддерживать механизм добавления агента JAR в путь к системному классу.
но я никогда не пробовал: - |
Ответ 2
См. Запуск агента Java после запуска программы.
Он ссылается на http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/, который в разделе "Динамическая загрузка javaagent во время выполнения" содержит рабочий пример:
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();
}
Обратите внимание, что Java 9 требует наличия -Djdk.attach.allowAttachSelf=true
среди аргументов запуска JVM.
Ответ 3
Вы можете использовать ea-agent-loader
С его загрузкой агент во время выполнения будет выглядеть так:
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!");
}
}
Ответ 4
Здесь библиотека, которая инициализирует aspectj и spring - рассматривает во время выполнения, вводя инструментальные средства: https://github.com/subes/invesdwin-instrument
Вы можете использовать его как более сложный образец.