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...