ByteBuddy多AgentBuilder异常:AgentBuilder1影响AgentBuilder2调用频率
匹配范围过宽导致大量类被增强
AgentBuilder1的类型匹配规则覆盖了几乎所有非私有InputStream子类,这包括大量JDK内部类(如BufferedInputStream、FileInputStream)和应用自定义的输入流实现。Byte Buddy在对这些类进行增强时,需要加载类元数据、生成增强后的字节码,这个过程会触发ClassLoader的getResource调用,用于查找类文件、辅助类或相关资源,这些调用会被AgentBuilder2捕获。增强后的read方法间接触发资源加载
AgentBuilder1给InputStream子类的read(...)方法添加了日志打印逻辑。如果日志打印依赖日志框架(如SLF4J、Logback),每次调用read方法时,日志框架可能会加载配置文件、本地化资源等,进而调用getResource。若应用中存在大量输入流读取操作,这类额外的资源加载调用会显著增加AgentBuilder2的日志量。Byte Buddy增强过程的额外开销
Byte Buddy在生成增强类时,会创建辅助类(如Advice相关的代理类),这些类的加载过程会触发getResource调用。当AgentBuilder1处理大量类时,这种内部类加载的频次会大幅提升,直接导致AgentBuilder2监控到的getResource调用次数增加。JDK核心类增强引发的连锁反应
由于AgentBuilder1未排除JDK核心的InputStream子类,增强后的类会在JVM内部类加载、资源访问等流程中被频繁使用。例如,JVM加载其他类时可能会通过这些输入流读取类文件,间接触发更多getResource调用,进一步放大日志量。
内容的提问来源于stack exchange,提问作者Jo Bo

