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方法。

猜你喜欢

转载自www.cnblogs.com/doit8791/p/12003174.html