2

我们已经在生产环境中运行 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。

谢谢!克里斯

4

1 回答 1

1

我们找到了内存泄漏的可能原因,但需要在 HK2 和 Jersey 之间进行更改。HK2 允许对其 API 之一进行一些不良使用,此后该 API 已被明确检查并禁止使用。然而,泽西岛以这种方式使用 API,这意味着泽西岛将不得不改变以做其他事情。这还没有发生,但会发生。

于 2014-07-01T18:10:29.770 回答