我看到默认的LocationStrategy
是STRONG
,它在创建ClassFileLocator
时保留了对类加载器的强引用。这是否意味着Byte Buddy可以防止类加载器被垃圾收集(例如,从servlet容器中取消部署webapp时)还是有其他机制来撤离这些?
同样在这方面 - 关于WEAK
策略的文档说,在相应的类加载器被垃圾收集后,ClassFileLocator
将“停止工作”。有什么影响?如何使用垃圾收集类加载器的定位器?
你对自己的主张是正确的。使用强类型定位器,所有TypeDescription
s都将引用类加载器,因为依赖类型会被懒惰地解析。这意味着,例如,如果您查找类型的字段类型,那么只有在您第一次使用它时才会加载该类型,这可能永远不会发生。
通常,这些类型描述不会在正在加载的类的生命周期内存储。由于类加载器在加载其中一个类期间永远不会被垃圾收集,因此强烈引用类加载器不会产生任何问题。但是,一旦你想要在多个类加载之间缓存类型描述(由于某些应用程序使用相同的类加载器加载了数千个类,这会导致很多因素),如果类加载器被垃圾收集,这可能会成为一个问题。缓存仍然使用底层类加载器引用类型描述。
在这种情况下,重用类型描述将是有问题的,因为在类加载器被垃圾收集后,不能解析延迟引用的类。请注意,类型描述可能使用特定的类加载器解析,而类由该类加载器的父级定义,这就是为什么这可能是一个问题。
通常,如果您为每个类加载器维护一个类型描述的缓存,那么这应该不是问题。