2010-01-25 130 views
12

我有一個當前在windows shell下運行的java進程。在現有的jvm進程中執行新的java代碼

一個負責串行化的線程被無限期阻塞,作爲被存儲在存儲器中的結果的重要信息不再被寫入磁盤。

如果我關閉了進程,信息將會丟失。

這將是方便,如果我可以編寫和編譯了一些新的代碼,並且它在相同的存儲空間內執行,以使上述信息可以更之前,我關閉過程中,一旦序列化。

該工藝使用java -jar命令啓動。

隨着HotSpot虛擬機的功能,有沒有什麼辦法來實現這一目標?

+0

你可以附加一個調試器的過程?如果是這樣,那麼你可能會觸發代碼來保存數據。 – jdigital 2010-01-25 05:29:13

+0

我在過去曾經使用過btrace的情況。 http://kenai.com/projects/btrace/pages/Home – 2010-01-25 05:34:37

+0

你應該說你正在使用什麼版本的JVM。 – 2010-01-25 05:44:05

回答

12

可以使用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中運行它。

祝你好運!

+0

謝謝,這可能是最好的選擇,但是我懷疑我能夠做到我想要的 - 這是有人在對象字段(沒有靜態引用)上獲得句柄並將其序列化。儘管我會盡我所能(最糟糕的)! – pstanton 2010-01-25 08:00:44

+0

實際上,我*可以通過在特定線程上拋出異常來解決我的問題。此線程無限期地掛在套接字上。我知道如何獲得線程的句柄,並且需要在其中引發異常,或者我可以終止並重新啓動它。會嘗試。謝謝。 – pstanton 2010-01-25 08:07:07

+0

你可以試着打斷它。 – 2010-01-25 09:25:43

相關問題