javaagent的實現


實現javaagent功能的是一個叫做instrument的JVMTIAgent(linux下對應的動態庫是libinstrument.so),另外instrument agent還有個別名叫JPLISAgent(Java Programming Language Instrumentation Services Agent),從這名字里也完全體現了其最本質的功能:就是專門為java語言編寫的插樁服務提供支持的。

instrument agent實現了Agent_OnLoadAgent_OnAttach兩方法,也就是說我們在用它的時候既支持啟動的時候來加載agent,也支持在運行期來動態來加載這個agent,其中啟動時加載agent還可以通過類似-javaagent:myagent.jar的方式來間接加載instrument agent,運行期動態加載agent依賴的是jvm的attach機制JVM Attach機制實現,通過發送load命令來加載agent。

Javaagent:javaagent通常可理解為一個“插件”,本質是一個jar文件,我們精心的編碼在其中描寫需要進行的操作,這些操作通過java.lang.Instrument包提供的API進行Java應用程序的增強控制,比如通過提供一個ClassFileTransformer的實現類來進行自定義的字節碼轉換操作

java.lang.instrument:JDK1.5之后提供的用於裝備Java應用程序的工具API,允許JavaAgent程序Instrument(裝備)在JVM上運行的應用程序,通常的做法是提供方法用於在字節碼中插入要執行的附加代碼。JDK1.6后提供兩種實現:命令行(-javaagent)形式在應用程序啟動前處理(premain方式);在應用程序啟動后的某個時機處理(agentmain方式)。

Instrumentation:此類提供能夠Instrument(裝備)Java代碼的服務方法。啟動Agent機制時,Instrumentation對象會被傳遞給premain或者agentmain方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM