You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Trevor Pounds (JIRA)" <ji...@apache.org> on 2010/10/12 06:13:40 UTC

[jira] Commented: (AMQ-2103) Memory leak when marshaling ActiveMQTextMessage to persistent store

    [ https://issues.apache.org/activemq/browse/AMQ-2103?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=62505#action_62505 ] 

Trevor Pounds commented on AMQ-2103:
------------------------------------

This fix looks like it will work but I do have some concerns implementing it as a destination policy. Wouldn't it make more sense to implement this using SoftReferences or a hook into the MarshallAware interface?  In my opinion it makes sense to clear memory at the discretion of the collector when the message has been completely serialized to disk when there is not enough memory. The actual problem I was trying to solve was to prevent "hidden" memory from hanging around that was not tied to the ActiveMQ memory usage policies. I could be missing something here but it seems there are disjoint philosophies for memory management related to overall broker memory usage, fast dispatch cursors and other unaccounted for "live" objects. I'm not sure what to do here but the proposed fix (including my original submission) seems like a kludge at best. Does anyone else have other opinions?

> Memory leak when marshaling ActiveMQTextMessage to persistent store
> -------------------------------------------------------------------
>
>                 Key: AMQ-2103
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2103
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.0.0
>         Environment: ActiveMQ 5.0.0.20-fuse
>            Reporter: Trevor Pounds
>            Assignee: Gary Tully
>             Fix For: 5.5.0
>
>         Attachments: AMQ-2103.diff, Duplicate Message Data (Internal Marshalling).png, heap_100_1MB_messages.png, jhat_ActiveMQTextMessage_0xe837a478.htm, jhat_ByteSequence_0xe837a5c0.htm, jhat_ByteSequence_data_0xe837adb0.htm
>
>
> When an org.apache.activemq.command.ActiveMQTextMessage is marshaled into the persistence store some portion of the messages are stored in memory (i.e. pending cursor/consumer dispatch queue).  The messages stored in memory have the potential to cause the broker to run out of memory because org.apache.activemq.command.ActiveMQTextMessage objects can store the data twice, once in the 'text' field and once in the 'content' field.  Normally this isn't a problem since the 'content' field is cleared when the message is being used in a client application (i.e. by calling getText() clears content).  The problem occurs when a consumer is slow and a large number of messages are sitting around on the broker in pending/dispatch memory space.  The message is marshaled for the store and then persisted to disk and copied to pending memory when space is available.
> This bug affects any ActiveMQ*Message object that does not clear its temporary data (i.e. 'text' field) once it has been marshaled.  When a message is marshaled we should null the derived objects memory space once the data has been written to the parent object's 'content' field.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.