[
https://issues.apache.org/activemq/browse/AMQ-2716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=59166#action_59166
]
TH L. edited comment on AMQ-2716 at 4/29/10 10:51 AM:
------------------------------------------------------
Deleting temp queue on destroying pool would be too late.
The temp queues, created by a session, should be closed immediately when the
session is closed.
Possible implementation:
When ActiveMQSession.createTemporaryQueue() is called, the ActiveMQSession hold
the reference on created temp queue,
When ActiveMQConnection.close() is called (and its referencing sessions are
going to be disposed), the referenced ActiveMQSession can delete its
referencing temp queues.
was (Author: easyl):
Or, the temp queue, created by a session, should be closed when the session
is closed.
ActiveMQSession can hold the reference on temp queue, when
ActiveMQSession.createTemporaryQueue() is called.
As ActiveMQConnection.close() is called (and its referencing sessions are going
to be disposed), the referenced ActiveMQSession can delete the temp queue
created in the session.
> ActiveMQConnection leaks memory by caching ActiveMQTempQueue objects
> --------------------------------------------------------------------
>
> Key: AMQ-2716
> URL: https://issues.apache.org/activemq/browse/AMQ-2716
> Project: ActiveMQ
> Issue Type: Improvement
> Components: Broker, Geronimo Integration, JMS client, Transport
> Affects Versions: 5.3.0
> Environment: 64bit, SuSE 11, Sun Java 1.6.0_17, Geronimo 2.2,
> embedded AMQ 5.3, TCP Tranport
> Reporter: TH L.
> Priority: Minor
>
> 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) {}
>
> }
> }}}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.