Утечка памяти между Jersey @BeanParam и HK2 ServiceLocatorImpl

Мы уже некоторое время запускаем трикотаж в производство и недавно заметили, что у нас началась утечка памяти. При копании мы обнаружили, что, начиная с 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, в которой нет инъекционного кеша.

Спасибо! Крис


person krisG    schedule 23.06.2014    source источник
comment
Я бы предложил добавить запись Jira здесь java.net/jira/browse/HK2. Было бы неплохо использовать простой воспроизводящий прецедент, но я думаю, что он не требуется...   -  person jwells131313    schedule 26.06.2014
comment
Кроме того, можем ли мы увидеть часть кода для вашего InjectionResolver? Спасибо   -  person jwells131313    schedule 26.06.2014
comment
Я зарегистрировал ошибку в JIRA на Джерси (java.net/jira/browse/JERSEY-2555), но добавление одного на HK2 имеет смысл. Я тоже это сделаю. У нас нет специального кода Injection Resolver. Все, что мы делаем, это используем новую аннотацию @BeanParam и позволяем фреймворку делать все остальное.   -  person krisG    schedule 26.06.2014
comment
Добавлен билет на HK2 java.net/jira/browse/HK2-216   -  person krisG    schedule 26.06.2014


Ответы (1)


Мы нашли вероятную причину утечки памяти, но для этого потребуются изменения между HK2 и Jersey. HK2 допустил неправомерное использование одного из своих API, который с тех пор был явно проверен и запрещен. Однако Джерси использует API таким образом, что означает, что Джерси придется изменить, чтобы сделать что-то еще. Это еще не произошло, но будет.

person jwells131313    schedule 01.07.2014
comment
Только что увидел этот комментарий. Спасибо за изучение этого, мы продолжим использовать 2.8 в то же время. Вы знаете, какой релиз майки предназначен для изменений? Если нет, мы просто будем периодически проверять примечания к выпуску и искать обновления. - person krisG; 30.07.2014
comment
Я спрошу у парней в майке - person jwells131313; 31.07.2014