2011-01-27 3 views
18

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

+0

раз я хотел, чтобы я мог присоединить отладчик в производстве ... – omerkudat

+0

@omerkudat Уши :). Затем запустите его с опцией отладчика, вы не увидите какого-либо реального недостатка в производительности, но отладчики могут вызвать утечки. – bestsss

+0

. Таким образом, опция debugger позволяет мне добавить javaagent во время выполнения? – Zubair

ответ

4

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

Запуск агентов После запуска ВМ

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

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

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

+0

«может предоставить» :-(Звучит весело, хотя :) –

21

См. 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.

1

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

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

14

Вы можете использовать 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!"); 
    } 
} 
+0

Я проверил 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

 Смежные вопросы

  • Нет связанных вопросов^_^