【问题标题】:How to interpret Eclipse Memory Analizer (memory leaks in a camel route)如何解释 Eclipse 内存分析器(骆驼路线中的内存泄漏)
【发布时间】:2018-10-13 23:18:32
【问题描述】:

我在 JBoss Fuse 中运行了几条骆驼路线(大约 100 条)。最近我遇到了 OutOfMemoryError: Java heap space,所以我决定使用 Eclipse Memory Analyzer Tool 来寻找漏洞。

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

11.539 个实例的“org.apache.http.impl.conn.PoolingHttpClientConnectionManager”,已加载 通过“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

http连接好像有问题,但我真的不知道。

我在 pollEnrichers 中这样使用 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);

或在处理器中使用 ProducerTemplate

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

所以,如您所见,我没有做太复杂的事情。

什么可能导致问题?

【问题讨论】:

    标签: java memory-leaks apache-camel eclipse-memory-analyzer


    【解决方案1】:

    好的...我解决了这个问题。这是骆驼参数和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 发生变化,camel 将使用 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();
    

    使用这种方法,camel 只创建了 1 个 http4 端点。

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

    再见。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多