Uploaded image for project: 'ActiveMQ Classic'
  1. ActiveMQ Classic
  2. AMQ-2716

ActiveMQConnection leaks memory by caching ActiveMQTempQueue objects

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 5.3.0
    • 5.6.0
    • None
    • 64bit, SuSE 11, Sun Java 1.6.0_17, Geronimo 2.2, embedded AMQ 5.3, TCP Tranport

    Description

      After running messaging several hours with more than 2,000,000 asynchronous send and more than1,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) {}
      }
      }}}

      Attachments

        Activity

          People

            tabish Timothy A. Bish
            easyl TH L.
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: