2011-01-27 8 views
18

Chcę profilować aplikację Java bez zatrzymywania aplikacji. Czy mogę w jakiś sposób dodać moduł Javaagent podczas działania aplikacji?Jak dodać moduł Javaagent do maszyny JVM bez zatrzymywania maszyny JVM?

+0

Czasy Żałowałam, że nie mogę dołączyć debugera w produkcji ... – omerkudat

+0

@omerkudat ouchy :). Następnie uruchom go w opcji debuggera, nie zobaczysz żadnej rzeczywistej wady wydajności, ale debuggery mogą powodować przecieki. – bestsss

+0

Tak więc opcja debuggera pozwala mi dodawać javaagenta w czasie wykonywania? – Zubair

Odpowiedz

4

Powinna być możliwa zgodnie z dokumentacją pakietu java.lang.instrument.

Począwszy Agencje Po VM startowego

implementacja może stanowić mechanizm do uruchomienia środków kiedyś po VM została uruchomiona. Szczegółowe informacje na temat sposobu zainicjowania tego procesu są podane w postaci , ale zwykle aplikacja już się rozpoczęła, a jej główna metoda już została wywołana . W przypadkach, gdy implementacja wspiera się uruchomienie środków po VM ma rozpoczęła obowiązuje:

1. manifest JAR agent musi zawierać atrybut agent klasie. Wartość tego atrybutu jest nazwą klasy agenta .
2. Klasa agenta musi zaimplementować publiczną metodę agenta statystycznego .
3. Program ładujący klasy systemu (ClassLoader.getSystemClassLoader) musi obsłużyć mechanizm dodawania pliku JAR agenta do ścieżki systemowej.

ale nigdy tego nie próbowałem: - |

+0

"może dostarczyć" :-(Brzmi fajnie :) –

21

Zobacz Starting a Java agent after program start.

To linki do http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ że pod „Dynamiczne ładowanie z javaagent w czasie wykonywania” daje przykład pracy:

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(); 
} 

Zauważ, że Java 9 wymaga -Djdk.attach.allowAttachSelf=true być obecny wśród JVM argumentów startowych.

14

Można użyć ea-agent-loader

z nim ładowania agenta w środowisku wykonawczym będzie wyglądać następująco:

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

Sprawdziłem ładowarkę ea-agent, która wygląda całkiem nieźle. Niestety to nie działa dla mnie: https://stackoverflow.com/questions/48678557/how-to-start-aspectj-loadtime-weaver-agent-without-restarting-jvm-how-to-start i tutaj https://github.com/electronicarts/ea-agent-loader/issues/9 – cilap

Powiązane problemy