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