我有一個當前在windows shell下運行的java進程。在現有的jvm進程中執行新的java代碼
一個負責串行化的線程被無限期阻塞,作爲被存儲在存儲器中的結果的重要信息不再被寫入磁盤。
如果我關閉了進程,信息將會丟失。
這將是方便,如果我可以編寫和編譯了一些新的代碼,並且它在相同的存儲空間內執行,以使上述信息可以更之前,我關閉過程中,一旦序列化。
該工藝使用java -jar
命令啓動。
隨着HotSpot虛擬機的功能,有沒有什麼辦法來實現這一目標?
我有一個當前在windows shell下運行的java進程。在現有的jvm進程中執行新的java代碼
一個負責串行化的線程被無限期阻塞,作爲被存儲在存儲器中的結果的重要信息不再被寫入磁盤。
如果我關閉了進程,信息將會丟失。
這將是方便,如果我可以編寫和編譯了一些新的代碼,並且它在相同的存儲空間內執行,以使上述信息可以更之前,我關閉過程中,一旦序列化。
該工藝使用java -jar
命令啓動。
隨着HotSpot虛擬機的功能,有沒有什麼辦法來實現這一目標?
可以使用Attach API附加到虛擬機。 Here's an article that explains how to use it
下面是一個代碼示例:
String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
當代理是您的罐子的名稱。
劑罐含有Agent,其可以與使用儀器API的JVM接口。
創建,使程序在運行時加載的代理,你實現一個agentmain
功能是這樣的:
public static void agentmain(String agentArgs, Instrumentation inst);
或
public static void agentmain(String agentArgs);
的Instrumentation對象用於在運行時修改類,你可能不需要。但是,希望您只需將任何需要的代碼放入agentmain中運行,然後使用attach API在目標JVM中運行它。
祝你好運!
您可能會嘗試註冊信號處理程序,這在Windows上比在其他平臺上更受限制。
例子和說明 http://www.ibm.com/developerworks/java/library/i-signalhandling/
但要問的問題是,爲什麼是線程阻塞?
https://issues.apache.org/jira/browse/NET-35:S – pstanton 2010-01-25 06:40:02
你可以附加一個調試器的過程?如果是這樣,那麼你可能會觸發代碼來保存數據。 – jdigital 2010-01-25 05:29:13
我在過去曾經使用過btrace的情況。 http://kenai.com/projects/btrace/pages/Home – 2010-01-25 05:34:37
你應該說你正在使用什麼版本的JVM。 – 2010-01-25 05:44:05