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