我看到默认的LocationStrategy
是STRONG
,在创建ClassFileLocator
时,它对类加载器有很强的引用。这是否意味着Byte Buddy可以防止垃圾回收类加载器(例如,当从servlet容器中取消部署Web应用程序时)还是有另一种机制来撤离那些类加载器?
在这方面,关于WEAK
策略的文档指出ClassFileLocator
将在垃圾回收相应的类加载器后“停止工作”。这意味着什么?
答案 0 :(得分:1)
您的主张正确。使用强类型定位符时,所有的TypeDescription
都将引用类加载器,因为依赖类型被延迟解析。例如,这意味着,如果您查找类型的字段类型,则仅当您第一次使用它时,才会加载该类型。
通常,这些类型描述不会在正在加载的类的生存期内存储。由于类加载器永远不会在其类之一的加载期间被垃圾回收,因此强烈引用类加载器不会造成任何问题。但是,一旦您想在多个类加载之间缓存类型描述(由于某些应用程序使用同一个类加载器加载了数千个类,这会产生很大的意义),如果一个类加载器在执行过程中被垃圾回收,这可能会成为问题。缓存仍在使用基础类加载器引用类型描述。
在这种情况下,重用类型描述将是有问题的,因为在垃圾回收类加载器之后,无法解析任何延迟引用的类。请注意,当类由该类加载器的父级定义时,可以使用特定的类加载器解析类型描述,这就是为什么这可能是个问题。
通常,如果您为每个类加载器维护类型描述的缓存,那么这应该不是问题。