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?
Odpowiedz
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: - |
"może dostarczyć" :-(Brzmi fajnie :) –
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.
Tu biblioteka, która inicjuje AspectJ i wiosenno-aspekty w czasie wykonywania przez wstrzykiwanie instrumentacji: https://github.com/subes/invesdwin-instrument
Można go używać jako bardziej skomplikowany próbki.
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!");
}
}
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
- 1. Zrozumienie maszyny JVM Lepiej
- 2. W jaki sposób maszyny JVM implementują IdentityHashMap?
- 3. Czy mogę dodać nowy certyfikat do magazynu kluczy bez restartowania maszyny JVM?
- 4. Jak sprawdzić użycie sterty uruchomionej maszyny JVM z wiersza poleceń?
- 5. W ramach działającej maszyny JVM, jak programowo określić opcje jvm używane podczas uruchamiania?
- 6. Jak przyspieszyć uruchamianie JVM?
- 7. Jak podłączyć JMC (Java Mission Control) do zdalnej maszyny JVM w Ubuntu?
- 8. Implementacja C# dla JVM
- 9. Java: Rdzenie dostępne dla JVM?
- 10. Jak określić domyślne argumenty maszyny JVM dla programów uruchamianych z środowiska Eclipse?
- 11. Znajomość NUMA JVM
- 12. lsof odpowiednik JVM?
- 13. Maszyny wirtualne
- 14. Dołącz replikę clojure/scala do działającego JVM
- 15. GWT kompiluje awarie JVM
- 16. Wiązana aplikacja JavaFX działa z argumentami innymi niż angielski "Nie można uruchomić maszyny JVM"
- 17. Czy mogę zrzucić bieżące zmienne stosu wątków z żywej maszyny JVM?
- 18. Czy istnieje przenośny sposób sprawdzenia, ile plików JVM ma otworzyć z wnętrza maszyny wirtualnej?
- 19. Nieprzenikniony błąd spowodowany przez wyłączenie wątku maszyny JVM, ponieważ w systemie ActorSystem
- 20. Dodawanie invokestatic do java/lang/Object. <init> za pośrednictwem agenta JVM TI powoduje awarię maszyny JVM z użyciem segmentfault
- 21. Doświadczenie przejścia na 64-bitową maszynę JVM
- 22. Łańcuch sygnałów JVM SIGPIPE
- 23. JVM okresowo zawiesza się
- 24. Czy istnieje maszyna JVM, która nie jest wyposażona w moduł do zbierania śmieci?
- 25. Model maszyny do programowania funkcjonalnego
- 26. Jak ustawić naprawdę duży rozmiar sterty JVM?
- 27. Dopasowanie projektu maszyny wirtualnej do jej podstawowego języka programowania
- 28. Wyłączanie maszyny wirtualnej zwraca wszystkie stany maszyny wirtualnej jako nieznane.
- 29. jak rozwidlić JVM?
- 30. Przeczytaj parametry uruchamiania Java JVM (np. -Xmx)
Czasy Żałowałam, że nie mogę dołączyć debugera w produkcji ... – omerkudat
@omerkudat ouchy :). Następnie uruchom go w opcji debuggera, nie zobaczysz żadnej rzeczywistej wady wydajności, ale debuggery mogą powodować przecieki. – bestsss
Tak więc opcja debuggera pozwala mi dodawać javaagenta w czasie wykonywania? – Zubair