java instrument的一些注意事项

1. 若agent与应用程序同时启动,

  a. agent类将由System Class Loader来装载

  b. 如果agent不能装载,那么应用程序也不能启动

  c. 如果agent的premain方法抛异常,应用程序也会被强制退出

2.ClassFileTransformer的 transform 发生在三种场合:

    a. when classes are defined  (当ClassLoader.defineClass()调用时 (这个方法把字节码对应的byte[]变成Class对象))

    b. when classes are redefined (当Instrumentation.redefineClasses()被调用时)

    c. when classes are retransformed (当Instrumentation.retransformClasses()被调用时) (if canRetransform is true)

   注意:servlet容器重启Context时会触发ClassLoader.defineClass(),从而触发ClassFileTransformer.transform();如果某class在重启之前就已经被transform()过,这时就会再做一次transform();如果transform()的内容是添加一个方法,这时就会把方法再增添一次,造成一个类里有两处重名的方法,从而导致编译错误

3. Class Loading有好几步,transform则会发生在字节码校验verfication之前

4. 一个agent可以有多个transformer,各个transformer会依次执行。即使其中一个transformer抛出异常,下一个transformer也仍然会执行

5. 关于异常

  a.若agent在应用启动后才启动,如果异常一直往外抛没有处理,控制台并不会自动打印这个异常 (通过实验证明,文档并无描述)

  b.若agent与应用程序一起启动,则…(待研究)

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.