Мы уже некоторое время запускаем трикотаж в производство и недавно заметили, что у нас началась утечка памяти. При копании мы обнаружили, что, начиная с HK2 2.3.0, в класс HK2 был добавлен injecteeToResolverCache (org.jvnet.hk2.internal.ServiceLocatorImpl.class).
Вот строка из класса ServiceLocatorImpl.
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, как Injectee в injecteeToResolverCache. Поскольку новые экземпляры BeanParams "paging" и "filter" создаются при каждом вызове ресурса "getStuff", при каждом вызове в кеш добавляются 2 новые записи. Мы получили более 10 миллионов записей в этом кеше, прежде чем все начало разваливаться.
Кто-нибудь еще сталкивался с этим или мы неправильно используем фреймворк?
На данный момент мы понизили версию до jersey 2.8, и это, похоже, работает, поскольку зависит от версии 2.2.0 Hk2, в которой нет инъекционного кеша.
Спасибо! Крис