wykonanie nowego kodu Javy w istniejącym procesie jvm
Mam obecnie uruchomiony proces java pod powłoką windows.
Jeden z wątków odpowiedzialnych za serializację jest blokowany na czas nieokreślony, w wyniku czego ważne informacje przechowywane w pamięci nie są już zapisywane na dysk.
Jeśli zamknę proces, informacja zostanie utracona.Byłoby wygodne, gdybym mógł napisać i skompilować jakiś nowy kod i wykonać go w tej samej przestrzeni pamięci, aby wspomniane informacje mogły być serializowane jeszcze raz, zanim zamknę ten proces.
Proces został uruchomiony przy użyciu polecenia java -jar
.
Czy dzięki funkcjom hotspot VM można to jakoś osiągnąć?
2 answers
Możesz użyć Dołącz API aby dołączyć do maszyny wirtualnej. oto artykuł, który wyjaśnia, jak z niego korzystać
Oto przykład kodu:
String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
Gdzie agent to nazwa Twojego słoika.
Agent jar zawiera agenta , który może łączyć się z JVM za pomocą interfejsu API oprzyrządowania.
Aby utworzyć agenta, który zostanie załadowany w czasie wykonywania, zaimplementujesz agentmain
funkcję taką jak:
public static void agentmain(String agentArgs, Instrumentation inst);
Lub
public static void agentmain(String agentArgs);
The Instrumentation obiekt służy do modyfikowania klas w czasie wykonywania, czego prawdopodobnie nie potrzebujesz. Ale mam nadzieję, że możesz po prostu umieścić kod potrzebny do uruchomienia w agentmain, a następnie użyć dołączonego API, aby uruchomić go w docelowym JVM.
Powodzenia!!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 07:49:15
Możesz spróbować zarejestrować obsługę sygnału, jest to bardziej ograniczone w systemie Windows niż na innych platformach.
Przykłady i opis http://www.ibm.com/developerworks/java/library/i-signalhandling/
Ale pytanie, dlaczego wątek jest zablokowany?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 06:17:04