Как я могу добавить Javaagent к JVM, не останавливая JVM? - PullRequest
21 голосов
/ 27 января 2011

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

Ответы [ 4 ]

26 голосов
/ 23 октября 2012

См. Запуск агента 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.

13 голосов
/ 03 марта 2016

Вы можете использовать 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!");
    }
}
5 голосов
/ 27 января 2011

Это должно быть возможно в соответствии с документацией пакета java.lang.instrument .

Запуск агентов после запуска виртуальной машины

Реализация может предоставить механизм для запуска агентов когда-нибудь после того, как ВМ началась. подробности о том, как это начато являются конкретными для реализации, но как правило, приложение уже начал и его основной метод имеет уже был вызван. В случаях, когда реализация поддерживает запуск агентов после того, как VM имеет начал следующее применяется:

1. Манифест агента JAR должен содержать атрибут Агент-класс. Ценность этого атрибут это имя агента класс.
2. Класс агента должен реализовывать открытый статический агент способ.
3. Системный загрузчик классов (ClassLoader.getSystemClassLoader) должен поддерживать механизм добавления агента JAR-файл к системному пути.

но я никогда не пробовал : - |

1 голос
/ 03 августа 2015

Здесь библиотека, которая инициализирует aspectj и spring-аспекты во время выполнения путем введения инструментов: https://github.com/subes/invesdwin-instrument

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...