Java 如何解释Eclipse内存分析器(驼峰路径中的内存泄漏)

Java 如何解释Eclipse内存分析器(驼峰路径中的内存泄漏),java,memory-leaks,apache-camel,eclipse-memory-analyzer,Java,Memory Leaks,Apache Camel,Eclipse Memory Analyzer,我在JBoss Fuse中运行了几条驼峰路线(大约100条)。最近我遇到了一个OutOfMemoryError:Java堆空间,所以我决定使用Eclipse内存分析器工具来查找漏洞 报告显示了几个嫌疑人,但最大的一个是: 11.539个“org.apache.http.impl.conn.poollighttpclientconnectionmanager”实例已加载 作者:org.apache.felix.framework.BundleWiringImpl$BundleClassLoader

我在JBoss Fuse中运行了几条驼峰路线(大约100条)。最近我遇到了一个OutOfMemoryError:Java堆空间,所以我决定使用Eclipse内存分析器工具来查找漏洞

报告显示了几个嫌疑人,但最大的一个是:

11.539个“org.apache.http.impl.conn.poollighttpclientconnectionmanager”实例已加载 作者:org.apache.felix.framework.BundleWiringImpl$BundleClassLoaderJava5 @0xd16558b8“占用443.624.920(63,87%)字节

与其他泄漏问题不同,本案例的详细报告很小,只有4行:

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

似乎http连接有问题,但我真的不知道

我在pollenricher中使用http组件,如下所示:

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);
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();
或者在处理器内部使用产品模板

final String URL = exchange.getContext().resolvePropertyPlaceholders("{{URL_PAGO}}");
ProducerTemplate producer = exchange.getContext().createProducerTemplate();
String response = producer.requestBody(URL, "", String.class);
producer.stop();
所以,正如你所看到的,我没有做太复杂的事情


什么可能导致问题?

好的。。。我解决了这个问题。它是介于camel参数和http参数之间的东西

第一:实际上,我是这样使用http4组件的:

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);
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\u查询的标头 信息:

但是。。。如果value1和/或value2发生更改,camel将使用URL+PARAMS创建新端点。因此,如果我使用该代码一百万次,它将创建一百万个包含所有内容(头、caché等)的http4端点

为了避免这种情况,我使用了Exchange.HTTP\u查询头:

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();
String URL=exchange.getContext().resolvePropertyPlaceholders(“{URL_PAGO}”);
字符串PARAMS=“param1=“+value1+”¶m2=“+value2;
Map headers=newhashmap();
headers.put(Exchange.HTTP_查询,参数);
ProducerTemplate producer=exchange.getContext().createProducerTemplate();
String response=producer.requestBody(URL“”,标题,String.class);
生产者。停止();
使用此方法,camel仅创建1个http4端点

我认为文档应该更详细地说明这一点

再见