【发布时间】:2014-06-23 17:35:44
【问题描述】:
我们已经在生产环境中运行 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。
谢谢! 克里斯
【问题讨论】:
-
我建议在这里添加一个 Jira 条目 java.net/jira/browse/HK2。一个简单的用例复制器会很好,但我猜这不是必需的......
-
另外,我们可以看看你的 InjectionResolver 的一些代码吗?谢谢
-
我在 Jersey 的 JIRA (java.net/jira/browse/JERSEY-2555) 上提交了一个错误,但在 HK2 上添加一个是有意义的。我也会这样做。我们没有任何自定义注入解析器代码。我们所做的就是使用新的@BeanParam 注解,让框架完成剩下的工作。
-
加票到HK2 java.net/jira/browse/HK2-216
标签: java jersey jersey-2.0 hk2