Byte Buddy位置策略类型

问题描述 投票:1回答:1

我看到默认的LocationStrategySTRONG,它在创建ClassFileLocator时保留了对类加载器的强引用。这是否意味着Byte Buddy可以防止类加载器被垃圾收集(例如,从servlet容器中取消部署webapp时)还是有其他机制来撤离这些?

同样在这方面 - 关于WEAK策略的文档说,在相应的类加载器被垃圾收集后,ClassFileLocator将“停止工作”。有什么影响?如何使用垃圾收集类加载器的定位器?

byte-buddy
1个回答
1
投票

你对自己的主张是正确的。使用强类型定位器,所有TypeDescriptions都将引用类加载器,因为依赖类型会被懒惰地解析。这意味着,例如,如果您查找类型的字段类型,那么只有在您第一次使用它时才会加载该类型,这可能永远不会发生。

通常,这些类型描述不会在正在加载的类的生命周期内存储。由于类加载器在加载其中一个类期间永远不会被垃圾收集,因此强烈引用类加载器不会产生任何问题。但是,一旦你想要在多个类加载之间缓存类型描述(由于某些应用程序使用相同的类加载器加载了数千个类,这会导致很多因素),如果类加载器被垃圾收集,这可能会成为一个问题。缓存仍然使用底层类加载器引用类型描述。

在这种情况下,重用类型描述将是有问题的,因为在类加载器被垃圾收集后,不能解析延迟引用的类。请注意,类型描述可能使用特定的类加载器解析,而类由该类加载器的父级定义,这就是为什么这可能是一个问题。

通常,如果您为每个类加载器维护一个类型描述的缓存,那么这应该不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.