字节好友 LocationStrategy 类型
Byte Buddy LocationStrategy types
我看到默认的 LocationStrategy
是 STRONG
,它在创建 ClassFileLocator
时保持对 class 加载程序的强引用。这是否意味着 Byte Buddy 可以防止 class 加载程序被垃圾收集(例如,当从 servlet 容器取消部署 webapp 时)或者是否有其他机制来撤离这些?
同样在这方面 - 关于 WEAK
策略的文档说 ClassFileLocator
将在相应的 class 加载程序被垃圾收集后 "stop working"。有什么影响?如何使用垃圾收集器 class 加载器的定位器?
你的说法是对的。使用强类型定位器,所有 TypeDescription
都将引用 class 加载器,因为依赖类型是延迟解析的。这意味着,例如,如果您查找类型的字段类型,则只有在您第一次使用它时才会加载该类型,而这可能永远不会发生。
通常,这些类型描述不会在加载 class 的整个生命周期内存储。由于 class 加载器在加载其 class 之一期间永远不会被垃圾收集,因此强烈引用 class 加载器不会出现任何问题。然而,一旦你想在多个 class 加载之间缓存类型描述(这很有意义,因为一些应用程序使用相同的 class 加载器加载数千个 classes),这个如果 class 加载程序将被垃圾收集,而缓存仍在引用底层 class 加载程序的类型描述,则可能会成为问题。
在这种情况下,重用类型描述会出现问题,因为在 class 加载程序被垃圾回收后无法解析延迟引用的 classes。请注意,类型描述可能会使用特定的 class 加载程序来解析,而 class 是由该 class 加载程序的父级定义的,这就是为什么这可能是一个问题。
通常,如果您维护每个 class 加载器的类型描述缓存,这应该不是问题。
我看到默认的 LocationStrategy
是 STRONG
,它在创建 ClassFileLocator
时保持对 class 加载程序的强引用。这是否意味着 Byte Buddy 可以防止 class 加载程序被垃圾收集(例如,当从 servlet 容器取消部署 webapp 时)或者是否有其他机制来撤离这些?
同样在这方面 - 关于 WEAK
策略的文档说 ClassFileLocator
将在相应的 class 加载程序被垃圾收集后 "stop working"。有什么影响?如何使用垃圾收集器 class 加载器的定位器?
你的说法是对的。使用强类型定位器,所有 TypeDescription
都将引用 class 加载器,因为依赖类型是延迟解析的。这意味着,例如,如果您查找类型的字段类型,则只有在您第一次使用它时才会加载该类型,而这可能永远不会发生。
通常,这些类型描述不会在加载 class 的整个生命周期内存储。由于 class 加载器在加载其 class 之一期间永远不会被垃圾收集,因此强烈引用 class 加载器不会出现任何问题。然而,一旦你想在多个 class 加载之间缓存类型描述(这很有意义,因为一些应用程序使用相同的 class 加载器加载数千个 classes),这个如果 class 加载程序将被垃圾收集,而缓存仍在引用底层 class 加载程序的类型描述,则可能会成为问题。
在这种情况下,重用类型描述会出现问题,因为在 class 加载程序被垃圾回收后无法解析延迟引用的 classes。请注意,类型描述可能会使用特定的 class 加载程序来解析,而 class 是由该 class 加载程序的父级定义的,这就是为什么这可能是一个问题。
通常,如果您维护每个 class 加载器的类型描述缓存,这应该不是问题。