ActiveMQConnection leaks memory by caching ActiveMQTempQueue objects
--------------------------------------------------------------------

                 Key: AMQ-2716
                 URL: https://issues.apache.org/activemq/browse/AMQ-2716
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker, Geronimo Integration, JMS client, Transport
    Affects Versions: 5.3.0
         Environment: 64bit, SuSE 10, Sun Java 1.6.0_17, Geronimo 2.2, embedded 
AMQ 5.3
            Reporter: TH L.
            Priority: Critical


After running messaging several hours with about 2,000,000 asynchronous send 
and about 1,000,000 synchronous send/reply (with temp Queue), I found about 
1.5G ActiveMQConnection objects in my whole 2G memory heap (inspected with jmap 
and Eclipse Memory Analyzer).

The 1.5G ActiveMQConnection objects and their referencing objects stay in heap 
old generation and cannot be cleaned by GC.

By looking into those ActiveMQConnections, I found there are a huge amount of 
HashMaps holding temp Queue information (e.g. ActiveMQTempQueue with different 
sequenceId, physicalName, etc.)

Since the ActiveMQConnections are pooled, however, why those ActiveMQTempQueues 
are always kept in ActiveMQConnections?

is that a bug? or did I do something wrong (wrong setup, wrong client code)?

My client code
{{{
        QueueConnection connection = null;
        QueueSession session = null;
        Queue requestQueue = null;
        Queue replyQueue = null;
        QueueReceiver receiver = null;
        QueueSender sender = null;

        try {
            connection = aConnFactory.createQueueConnection();
            connection.start();
            session = connection.createQueueSession(false, 
Session.AUTO_ACKNOWLEDGE);
            requestQueue = getDestinationQueue();
            sender = session.createSender(requestQueue);
            replyQueue = session.createTemporaryQueue(); // using temp queue
            aRequestMessage.setJMSReplyTo(replyQueue);
            sender.send(aRequestMessage, DeliveryMode.NON_PERSISTENT, 
Message.DEFAULT_PRIORITY, timeToLive);
            receiver = session.createReceiver(replyQueue);
            receiver.receive();
        } catch (Exception e) {
              ...
        } finally {
            try { receiver.close(); } catch (Exception ignored) {}
            try { sender.close(); } catch (Exception ignored) {}
            try { session.close(); } catch (Exception ignored) {}
            try { connection.close(); } catch (Exception ignored) {}            
        }
}}}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to