簡體   English   中英

Javaagent類卸載

[英]Javaagent class unloading

我有一個java代理程序,用於檢測字節碼。 我在java 6中使用attach apis允許用戶使用我的java代理動態加載代理和儀器以及deinstrument代碼。 我正在使用Boot-Class-Path清單屬性來確保我的javagent類在引導類路徑中,以便我的用戶可以檢測類似ArrayList等的類。

但問題是版本控制。 讓我們說用戶動態地附加我的代理的版本1。 然后我給了他第2版。既然他的應用服務器從未關閉,因為他附加了我的代理的版本1,版本1類仍然加載。

我需要某種方式,當我的客戶端版本2的javaagent,版本1被卸載。

我知道一種方法是為我的javaagent類編寫一個客戶類加載器,並將類加載器引用設置為null。 但是在這種情況下,我無法在引導類路徑中檢測類,因為我的類加載器將位於引導類加載器的層次結構中,因此我的用戶無法使用類似ArrayList的工具類,因為如果我在ArrayList的方法中添加一個調用到我的一個agent的類的方法,引導類加載器將無法看到它們。

那么有什么方法可以解決引導類路徑問題並仍然卸載以前代理的類?

我不是這個主題的專家,但似乎沒有直接支持這種卸載替換。

但是你需要卸載 - 更換課程嗎?

您是否可以創建一個永不改變的類,外部世界會與之交談,您可以在其中內部實現版本控制系統?

例如,您創建了一個MyToolAgent類,它具有一個靜態字符串,其中包含要使用的ToolAgentImplementation的類名。 首次發布時,它設置為使用ToolAgentImplementation1_0。 升級到2.0版時,將部署另一個名為ToolAgentImplmenetation2_0的類,並更新MyToolAgent類以加載和使用它。 您永遠不會卸載版本1.0,但您確實停止使用它。 你在這里浪費了一些內存,但是你實現了版本升級。

我不知道在你的情況下這是否可行,但總的來說似乎JVM不支持直接交換新版本,但你應該能夠以某種方式隱藏它。

我不確定這會起作用,但它可能會給你一些選擇......

而不是嘗試重新加載當前代理(讓我們稱之為工具代理),添加新代理(安裝程序代理)。 安裝程序代理只有一個函數:使用RedefineClasses()替換原始工具代理類。

如果將版本號命名為安裝程序代理程序作為類名(MyToolInstallerV1)的一部分,則可以繼續加載更新工具代理程序的新安裝程序。 如果大小成為一個問題,也許安裝程序代理可以查找以前的安裝程序並用一個小的無操作存根替換它們的類。

我現在還沒有檢測任何東西,但我只是在玩java.util.ServiceLoader並實現了某種插件架構,並使用URLClassLoader的方法進行動態JAR加載 - 卸載。

我不知道“儀器”可以通過這種方式改變,但可以跟蹤版本控制和動態加載 - 卸載問題,並且測試它真的很快,因為硬件是由ServiceLoader完成的(只需遵循微小的/ META-INF / services / XXX規范)你准備好了:)

問候。

OSGI的完美用例。 不確定您是否可以將代理插件捆綁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM