2016-06-08 10 views
0

CXF Компонент/сек: автобус, JAX-RSCXF - происходит утечка памяти, если шина сконфигурирован с поставщиками используется на-запросу клиентов

влияет версия/с: 3.1.0, 3.1. 6

Environment: Redhat Enterprise Linux (Santiago), OpenJDK 7, Tomcat 7

у нас есть приложение с клиентскими компонентами REST для совершения звонков на веб-сервисов Backend. Во время нашего рутинного теста производительности инструмент JProfiler показывает множество записей свойств шины (с ключами с именем «bus.providers.set.»), Заполненными при создании экземпляров ClientProviderFactory.

public final class ClientProviderFactory extends ProviderFactory { 

    public static ClientProviderFactory createInstance(Bus bus) { 
    ... 
    factory.setBusProviders(); 
    ... 
} 

Эти записи о собственности на автобус, похоже, остаются в куче в течение всего 6-минутного пробега. Фактически, около 100 000 записей занимают 13 Мб кучи. Короче говоря, GC, похоже, не так часто случается, чтобы поддерживать использование кучи в пределах.

Это какая-то ошибка или отсутствие необходимой конфигурации в CXF для оптимизации создания/очистки этих объектов?

ответ

0

Соответствующая проблема, по-видимому, вызвана a defect in CXF, где записи hashCode ProviderFactory заполняются экземпляром Bus, если используются клиенты для каждого запроса. Итак, если вы сделали N вызовов с момента запуска приложения, будет заполнено N количество записей. Следовательно, он занимает огромную кучу JVM и не получает GC, своевременно и приводит к проблемам с производительностью.

Хотя исправление CXF для дефекта будет доступно в моментальных снимках - 3.1.7 и 3.2.0, вы можете использовать следующее исправление для работы, если вы застряли с использованием CXF 3.1.6 или старше. Отлично работает.

Java код

public class PurgeFactoryHashcodeInterceptor extends AbstractPhaseInterceptor<Message> { 

    public PurgeFactoryHashcodeInterceptor() { 

     super(Phase.PREPARE_SEND); 
     addBefore(MessageSenderInterceptor.class.getName()); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 

      cleanUpBusProperties(); 
    } 

    @Override 
    public void handleFault(Message message) throws Fault { 

      cleanUpBusProperties(); 
    } 

    private void cleanUpBusProperties() { 

     Bus bus = SpringContextProvider.getApplicationContext().getBean(Bus.class); 
     Map<String,Object> origBusPropMap = bus.getProperties(); 

     for(Map.Entry<String,Object> busPropEntry : origBusPropMap.entrySet()) { 
      if(busPropEntry.getKey().startsWith("bus.providers.set.")) { 
       origBusPropMap.remove(busPropEntry.getKey()); 
      } 
     } 
    } 
} 

конфигурации Spring

<bean id="purgeFtryHashcodeInterceptor" class="com.mycompany.ws.interceptor.PurgeFactoryHashcodeInterceptor" /> 
 
    
 
<cxf:bus> 
 
     <cxf:properties> 
 
      <entry key="org.apache.cxf.jaxrs.bus.providers"> 
 
       <list> 
 
        <ref bean="throwableExceptionMapper" /> 
 
        <ref bean="customFilter1" /> 
 
       </list> 
 
      </entry> 
 
     </cxf:properties> 
 
     <cxf:outInterceptors> 
 
      <ref bean="purgeFtryHashcodeInterceptor" /> 
 
     </cxf:outInterceptors> 
 
</cxf:bus>

+0

Не забывайте голосовать меня, если вы столкнетесь с той же проблемой. –

 Смежные вопросы

  • Нет связанных вопросов^_^