【问题标题】:Memory leak in between Jersey @BeanParam and HK2 ServiceLocatorImplJersey @BeanParam 和 HK2 ServiceLocatorImpl 之间的内存泄漏
【发布时间】: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 注解,让​​框架完成剩下的工作。

标签: java jersey jersey-2.0 hk2


【解决方案1】:

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

【讨论】:

  • 刚看到这条评论。感谢您对此进行调查,同时我们将继续使用 2.8。你知道改变的目标是什么球衣版本吗?如果没有,我们将定期检查发行说明并查找更新。
  • 我会问球衣的人
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2011-01-12
  • 2014-08-16
相关资源
最近更新 更多