FWIW I still don't follow how working with newly created objects like
ByteArrayOutputStream() on the stack can be a memory leak. Are you
sure its just that the GC kicks in shortly after you're running the
code?


On 6/26/07, comchyi <[EMAIL PROTECTED]> wrote:



James.Strachan wrote:
>
> On 6/25/07, comchyi <[EMAIL PROTECTED]> wrote:
>>
>> I find an performance problem in ActiveMQ4.2-SNAPSHOT when
>> i subscribe an topic and consume 500000 messages,the problem
>> is that the memory of CPU is  consumed increasely all long until
>> the  free heap of JVM's memory  is  zone. The client code like this:
>>                          if (message instanceof TextMessage) {
>>                                 txtMsg = (TextMessage) message;
>>                                 String msg = txtMsg.getText();
>>                                 .....
>>                         }
>> I test this code by  JProfiler which is a tool of testing performance
>> ,and
>> find the cause is the method of txtMsg.getText() ,its implement method is
>> the org.apache.activemq.command.ActiveMQTextMessage.getText(),the code of
>> this method is :
>> package org.apache.activemq.command;
>> public class ActiveMQTextMessage extends ActiveMQMessage implements
>> TextMessage {
>> .......
>>  public String getText() throws JMSException {
>>         if (text == null && getContent() != null) {
>>             try {
>>                 ByteSequence bodyAsBytes = getContent();
>>                 if (bodyAsBytes != null) {
>>                     InputStream is = new
>> ByteArrayInputStream(bodyAsBytes);
>>                     if( isCompressed() ) {
>>                         is = new InflaterInputStream(is);
>>                     }
>>                     DataInputStream dataIn = new DataInputStream(is);
>>                     text = MarshallingSupport.readUTF8(dataIn);
>>                     dataIn.close();
>>                     setContent(null);
>>                 }
>>             } catch (IOException ioe) {
>>                 throw JMSExceptionSupport.create(ioe);
>>             }
>>         }
>>         return text;
>>     }
>> ......
>> }
>> In this code ,the instance  " is " is not closed ,i think must invoke
>> the method   in.close() to release the memory of JVM.I  suggest
>> modify the method  ActiveMQTextMessage.getText().
>
> I don't really see how ByteArrayInputStream or InflaterInputStream are
> memory leaks as they are constructed in each method and take a byte
> sequence, but I've applied a patch to always close it anyway
> --
> James
> -------
> http://macstrac.blogspot.com/
>
>
hi,james.
i see the change  of method  ActiveMQTextMessage.getText(). that you do,but
i find another problem that the memory leak still exits .i find if the new
problem is the method
org.apache.activemq.command.Message.beforeMarshall((WireFormat wireFormat)
).if i add a code in this method ,i find the used heap size of JVM's memory
descends quickly.the code that i added likes this:
 baos.close();  at the end of method's body.i suggest to chang
org.apache.activemq.command.Message.beforeMarshall((WireFormat wireFormat) )
like this:
 public void beforeMarshall(WireFormat wireFormat) throws IOException {
        // Need to marshal the properties.
        if( marshalledProperties==null && properties!=null ) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream os = new DataOutputStream(baos);
            MarshallingSupport.marshalPrimitiveMap(properties, os);
            os.close();
            marshalledProperties = baos.toByteSequence();
            baos.close();
        }
    }
--
View this message in context: 
http://www.nabble.com/Performance-problem-in-ActiveMQ4.2-SNAPSHOT-tf3973867s2354.html#a11302156
Sent from the ActiveMQ - User mailing list archive at Nabble.com.




--
James
-------
http://macstrac.blogspot.com/

Reply via email to