You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "TH L. (JIRA)" <ji...@apache.org> on 2010/04/29 11:51:31 UTC
[jira] Issue Comment Edited: (AMQ-2716) ActiveMQConnection leaks
memory by caching ActiveMQTempQueue objects
[ https://issues.apache.org/activemq/browse/AMQ-2716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=59158#action_59158 ]
TH L. edited comment on AMQ-2716 at 4/29/10 5:50 AM:
-----------------------------------------------------
With
{{{
TemporaryQueue replyQueue = null;
try {
...
replyQueue = session.createTemporaryQueue(); // using temp queue
...
catch (Exception e) { ... }
finally {
try { replyQueue.delete(); } catch (Exception ignored) { ignored.printStackTrace(); }
try { receiver.close(); } catch (Exception ignored) {}
try { sender.close(); } catch (Exception ignored) {}
try { session.close(); } catch (Exception ignored) {}
try { connection.close(); } catch (Exception ignored) {}
}
}}}
then, I got
javax.jms.JMSException: java.lang.NullPointerException
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1255)
at org.apache.activemq.ActiveMQConnection.deleteTempDestination(ActiveMQConnection.java:1891)
at org.apache.activemq.command.ActiveMQTempDestination.delete(ActiveMQTempDestination.java:51)
...
Caused by: java.lang.NullPointerException
at org.apache.activemq.broker.TransportConnection.processRemoveDestination(TransportConnection.java:473)
at org.apache.activemq.command.DestinationInfo.visit(DestinationInfo.java:124)
at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:297)
at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:175)
at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:68)
at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:210)
at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
... 1 more
was (Author: easyl):
{{{
TemporaryQueue replyQueue = null;
try {
...
session.createTemporaryQueue(); // using temp queue
...
catch (Exception e) { ... }
finally {
try { replyQueue.delete(); } catch (Exception ignored) { ignored.printStackTrace(); }
try { receiver.close(); } catch (Exception ignored) {}
try { sender.close(); } catch (Exception ignored) {}
try { session.close(); } catch (Exception ignored) {}
try { connection.close(); } catch (Exception ignored) {}
}
}}}
then, I got
javax.jms.JMSException: java.lang.NullPointerException
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1255)
at org.apache.activemq.ActiveMQConnection.deleteTempDestination(ActiveMQConnection.java:1891)
at org.apache.activemq.command.ActiveMQTempDestination.delete(ActiveMQTempDestination.java:51)
...
Caused by: java.lang.NullPointerException
at org.apache.activemq.broker.TransportConnection.processRemoveDestination(TransportConnection.java:473)
at org.apache.activemq.command.DestinationInfo.visit(DestinationInfo.java:124)
at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:297)
at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:175)
at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:68)
at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:210)
at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
... 1 more
> 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 11, Sun Java 1.6.0_17, Geronimo 2.2, embedded AMQ 5.3, TCP Tranport
> Reporter: TH L.
> Priority: Critical
>
> 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.