That's not a a memory leak you're seeing - that's the wacky Retroactive Consumer functionality - see http://activemq.apache.org/retroactive-consumer.html The default policy is FixedSizeSubscrptionRecoveryPolicy - and the default cache size for each topic in 5.1 is about 6mb. I'd suggest configuring a smaller size for the cache (this is done by default in 5.2) - or disabling it all together ;) - see see http://activemq.apache.org/subscription-recovery-policy.html

cheers,

Rob

http://fusesource.com
http://rajdavies.blogspot.com/



On 10 Oct 2008, at 01:55, Mark Webb wrote:

I have run across a memory leak that I have been able to reproduce.  I
am profiling the sample application in NetBeans and I believe that I
have traced the problem to
org .apache .activemq .openwire .v3.BaseDataStreamMarshaller.tightUnmarshalByteSequence(DataInput,
BooleanStream)

The sample program is a very simple application that sends an object
that I wrote to ActiveMQ every 200ms.  In NetBeans I am using the
"Live Allocated Objects" view and approximately 80% of all objects are
byte[].  If I view the Allocation Call Tree, the first few methods in
the tree are:

BaseDataStreamMarshaller.tightUnmarshalByteSequence(DataInput, BooleanStream)
  org.apache.activemq.util.ByteArrayOutputStream.checkCapacity(int)
      org.apache.activemq.util.ByteArrayOutputStream.<init>
         java.lang.StringCoding$StringEncoder.encode(char[],int,int)

The object that I am sending is a simple bean class and only contains
an int, String and byte[].

I am using the base configuration for ActiveMQ.  All my sample
application does is call sendObject(Serializable) every 200ms.  Here
is the simple JMS library that I wrote:

------------- START --------------------------
public class JmsLib {

   private TopicConnection connection;
   private Session session;
   private Topic destination;
   private MessageProducer producer;
   private MessageConsumer consumer;

   public JmsLib( ActiveMQConnectionFactory connFactory, String dest
) throws JMSException {

       connection = connFactory.createTopicConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
       destination = session.createTopic( dest );
       producer = session.createProducer( destination );
       consumer = session.createConsumer( destination );
       connection.start();
   }

   public void addMessageListener( MessageListener listener ) throws
JMSException{
       consumer.setMessageListener( listener );
   }

   public void sendObject( Serializable object ) throws JMSException{
       ObjectMessage message = session.createObjectMessage( object );
       producer.send(message);
   }
}
--------------- END --------------------------

Thanks for any help you may have...

Reply via email to