Я хочу профилировать приложение Java, не останавливая приложение. Можно ли каким-либо образом добавить Javaagent во время работы приложения?Как добавить Javaagent в JVM без остановки JVM?
ответ
Должно быть возможно в соответствии с документацией пакета java.lang.instrument.
Запуск агентов После запуска ВМ
Реализация может обеспечить механизм для запуска агентов иногда после запуска ВМ. сведения о том, как это инициировано являются специфичными для реализации, но обычно уже запущено приложение , и его основной метод уже вызвал . В случаях, когда реализация поддерживает запуска агентов после того, как виртуальная машина имеет начала применяется следующее:
1. манифест JAR агента должен содержать атрибут Agent-класс. Значение этого атрибута - это имя агента класс.
2. Класс агента должен реализовать общедоступный метод статического агента .
3. Системный загрузчик классов (ClassLoader.getSystemClassLoader) должен поддерживать механизм для добавления агента JAR-файл в путь к системному классу.
но я никогда не пробовал: - |
«может предоставить» :-(Звучит весело, хотя :) –
См. Starting a Java agent after program start.
Это ссылки на 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.
Здесь библиотека, которая инициализирует AspectJ и пружинные аспекты во время выполнения инъекционного инструментария: https://github.com/subes/invesdwin-instrument
Вы можете использовать его в качестве более сложного образца.
Вы можете использовать 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!");
}
}
Я проверил ea-agent-loader, который выглядит довольно хорошо. К сожалению, это не работает для меня: https://stackoverflow.com/questions/48678557/how-to-start-aspectj-loadtime-weaver-agent-without-restarting-jvm-how-to-start и здесь https://github.com/electronicarts/ea-agent-loader/issues/9 – cilap
раз я хотел, чтобы я мог присоединить отладчик в производстве ... – omerkudat
@omerkudat Уши :). Затем запустите его с опцией отладчика, вы не увидите какого-либо реального недостатка в производительности, но отладчики могут вызвать утечки. – bestsss
. Таким образом, опция debugger позволяет мне добавить javaagent во время выполнения? – Zubair