我们已经在生产环境中运行 jersey 一段时间了,最近注意到我们开始泄漏内存。挖掘时我们发现从 HK2 2.3.0 开始,在 HK2 类中添加了一个 injecteeToResolverCache (org.jvnet.hk2.internal.ServiceLocatorImpl.class)
这是来自 ServiceLocatorImpl.class 的行
private final Cache<Injectee, InjectionResolver<?>> injecteeToResolverCache = new Cache<Injectee, InjectionResolver<?>>(new Computable<Injectee, InjectionResolver<?>>()
在我们的设置中,我们使用 jersey 2.9 (hk 2.3.0),并且我们有使用 @BeanParam 的资源方法,看起来像这样:
public CustomResponse getStuff(
@BeanParam Paging paging, @BeanParam CustFilter filter){...
似乎正在发生的事情是 HK2 2.3.0 正在将标记为 BeanParameter 的任何内容的每个实例缓存为 injecteeToResolverCache 中的 Injectee。由于每次调用“getStuff”资源时都会创建“分页”和“过滤器”BeanParams 的新实例,因此每次调用时都会向缓存中添加 2 个新条目。在事情开始分崩离析之前,我们在这个缓存中拥有超过 1000 万个条目。
有没有其他人遇到过这种情况,或者我们是否错误地使用了框架?
现在我们已经降级到 jersey 2.8 并且这似乎正在工作,因为它依赖于没有注入缓存的 Hk2 的 2.2.0。
谢谢!克里斯