Подтвердить что ты не робот

Как добавить Javaagent в JVM без остановки JVM?

Я хочу профилировать приложение Java, не останавливая приложение. Можно ли каким-либо образом добавить Javaagent во время работы приложения?

4b9b3361

Ответ 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

Вы можете использовать его как более сложный образец.