簡體   English   中英

Apache Camel JMS內存泄漏?

[英]Apache Camel JMS memory leak?

我是使用Apache駱駝的新手,但是根據我的各種測試,我意識到將JMS用作隊列通道會造成內存泄漏,因為在消耗每條消息后不會減少使用的內存。

一個簡單的例子會更好地描述它:

public static void main(String args[]) throws Exception {
    CamelContext context = new DefaultCamelContext();
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    context.addComponent("experimental", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file://test").to("experimental:queue:test");
        }
    });
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("experimental:queue:test").to("stream:out");
        }
    });
    Main main = new Main();
    main.getCamelContexts().add(context);
    main.run();
}

有什么方法可以強制GC按需清理隊列或刷新其內容? 是否有更好的方法將駱駝用於此類解決方案?

干杯!

您當前正在將activemq與vm協議一起使用,因此它將在您的進程內創建一個代理。 您可以嘗試使用外部activemq代理嗎? 如果在這種情況下沒有內存泄漏,則問題出在activemq。 無論如何,vm協議主要用於測試。

如果ActiveMQ組件發生內存泄漏,我會感到驚訝-它是很久以前才發現的,因為它是一個非常常用的組件。

我會聽從Christian的建議,並實際上使用活動MQ代替VM,但是,我也將file:// test端點替換為direct:test之類的東西,然后在啟動上下文之后,創建生產者模板並淹沒路由帶有消息:

ProducerTemplate template = context.createProducerTemplate();
long msgNumber = 1;
while (true) {

   template.sendBody("direct:test", "message number " + msgNumber);
   msgNumber++;

}

如果那不會很快崩潰,那么gc很有可能在做它。 確保可以在探查器中運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM