Java Jersey@BeanParam和HK2 ServiceLocatorImpl之间内存泄漏
我们已经在生产中运行jersey一段时间了,最近注意到我们开始泄漏内存。挖掘时,我们发现从HK2 2.3.0开始,HK2类(org.jvnet.HK2.internal.ServiceLocatorImpl.class)中添加了一个injecteeToResolverCache 下面是ServiceLocatorImpl.class中的一行Java Jersey@BeanParam和HK2 ServiceLocatorImpl之间内存泄漏,java,jersey,jersey-2.0,hk2,Java,Jersey,Jersey 2.0,Hk2,我们已经在生产中运行jersey一段时间了,最近注意到我们开始泄漏内存。挖掘时,我们发现从HK2 2.3.0开始,HK2类(org.jvnet.HK2.internal.ServiceLocatorImpl.class)中添加了一个injecteeToResolverCache 下面是ServiceLocatorImpl.class中的一行 private final Cache<Injectee, InjectionResolver<?>> injecteeToReso
private final Cache<Injectee, InjectionResolver<?>> injecteeToResolverCache = new Cache<Injectee, InjectionResolver<?>>(new Computable<Injectee, InjectionResolver<?>>()
似乎正在发生的是,HK2 2.3.0正在将任何标记为BeanParameter的对象的每个实例缓存为injecteeToResolverCache中的注入对象。由于每次调用“getStuff”资源时都会创建“分页”和“筛选”BeanParms的新实例,因此每次调用时都会向缓存中添加2个新条目。在事情开始分崩离析之前,我们在这个缓存中有超过1000万个条目
是否有其他人遇到过这种情况,或者我们是否错误地使用了该框架
现在我们已经降级到jersey 2.8,这似乎是可行的,因为它依赖于Hk2的2.2.0,而Hk2没有注入缓存
谢谢!
Kris我们已经找到了内存泄漏的可能原因,但它需要在HK2和Jersey之间进行更改。HK2允许其一个API的一些不良使用,该API已被明确检查并被禁止。然而,Jersey以这种方式使用API,这意味着Jersey将不得不更改以执行其他操作。这还没有发生,但会发生。我建议在这里添加Jira条目。一个简单的用例复制器会很好,但我想这不是必需的…另外,我们可以看看您的InjectionResolver的一些代码吗?ThanksI在Jersey的JIRA()上提交了一个bug,但在HK2上添加一个bug是有意义的。我也会这么做。我们没有任何自定义注入解析器代码。我们所要做的就是使用新的@BeanParam注释,让框架来做其余的事情。感谢您的关注,同时我们将继续使用2.8。您知道更改的目标是什么jersey版本吗?如果没有,我们只需要定期检查发行说明并寻找更新。我会问泽西岛的人
public CustomResponse getStuff(
@BeanParam Paging paging, @BeanParam CustFilter filter){...