Как интерпретировать Eclipse Memory Analizer (утечки памяти на верблюде) - PullRequest
0 голосов
/ 03 мая 2018

Я использую несколько верблюжьих маршрутов (около 100) в JBoss Fuse. Недавно я получил OutOfMemoryError: Java heap space , поэтому я решил использовать Eclipse Memory Analyzer Tool для поиска утечек.

В отчете показано несколько подозреваемых, но самый большой из них:

11,539 экземпляров из "org.apache.http.impl.conn.PoolingHttpClientConnectionManager", загружено by "org.apache.felix.framework.BundleWiringImpl $ BundleClassLoaderJava5 @ 0xd16558b8 "занимают 443,624,920 (63,87%) байтов.

В отличие от других проблем с утечками, подробный отчет для этого случая небольшой, всего 4 строки:

класс java.lang.Thread @ 0xd0a9c0c8
\ class org.apache.camel.component.jms.DefaultJmsMessageListenerContainer @ 0xd367ee58 . \ class org.apache.camel.component.jms.JmsQueueEndpoint @ 0xd36750d8
.. \ class org.apache.camel.blueprint.BlueprintCamelContext @ 0xd33bcd50

Very small report

Кажется, что-то не так с http-соединениями, но я действительно не знаю.

Я использую компонент http в pollEnrichers следующим образом:

from(URI_COLA_ENTRADA_STEP)
.pollEnrich().simple("{{URL_CORRELATIVO}}?ruta=STEP", String.class).aggregationStrategy(new EstrategiaCorrelativo()).cacheSize(1).timeout(10000).aggregateOnException(true)
.to(URI_TOPIC_ARTICULOS);

или с ProducerTemplate внутри процессора:

final String URL = exchange.getContext().resolvePropertyPlaceholders("{{URL_PAGO}}");
ProducerTemplate producer = exchange.getContext().createProducerTemplate();
String response = producer.requestBody(URL, "", String.class);
producer.stop();

Итак, как вы видите, я не делаю ничего слишком сложного.

Что может быть причиной проблемы?

1 Ответ

0 голосов
/ 10 мая 2018

Хорошо ... Я решил проблему. Это была вещь между параметрами верблюда и параметрами http.

Во-первых: на самом деле я использовал компонент http4 следующим образом:

String URL = exchange.getContext().resolvePropertyPlaceholders("{{URL_PAGO}}");

String PARAMS = "?param1=" + value1 + "&param2=" + value2;

ProducerTemplate producer = exchange.getContext().createProducerTemplate();
String response = producer.requestBody(URL + PARAMS, "", String.class);
producer.stop();

Я так и сделал, потому что в документации сказано:

Производитель camel-http4 поддерживает параметры URI для отправки HTTP-сервер. Параметры URI могут быть установлены непосредственно на URI конечной точки или как заголовок с ключом Exchange.HTTP_QUERY на сообщение:

Но ... Если value1 и / или value2 изменятся, верблюд будет использовать URL + PARAMS для создания НОВОЙ конечной точки. Так что, если я буду использовать этот код миллион раз, он создаст миллион конечных точек http4 со всем содержимым (заголовками, кэшем и т. Д.).

Чтобы избежать этого, я использую Exchange.HTTP_QUERY заголовок:

String URL = exchange.getContext().resolvePropertyPlaceholders("{{URL_PAGO}}");

String PARAMS = "param1=" + value1 + "&param2=" + value2;
Map<String,Object> headers = new HashMap<String,Object>();
headers.put(Exchange.HTTP_QUERY, PARAMS);

ProducerTemplate producer = exchange.getContext().createProducerTemplate();
String response = producer.requestBody(URL, "",headers, String.class);
producer.stop();

используя этот метод, верблюд создает только 1 конечную точку http4.

Я думаю, что документация должна быть более подробной по этому вопросу.

Bye.

...