activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dejan Bosanac (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (AMQ-4182) Memory Leak for ActiveMQBytesMessage with Compression as true
Date Wed, 23 Apr 2014 11:00:17 GMT

     [ https://issues.apache.org/jira/browse/AMQ-4182?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Dejan Bosanac resolved AMQ-4182.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 5.10.0
         Assignee: Dejan Bosanac

I implemented explicit compression/decompression of the payload when we initialise writing
and reading operations.

http://git-wip-us.apache.org/repos/asf/activemq/commit/44bb9fbe

With this we can avoid using finalize() to close the streams, which can cause memory leaks.
The trade-off is that we keep uncompressed messages in memory, but IMHO that's not an issue
as compression is meant to be used on the wire and the similar approach is used for other
kind of messages.

There's still couple of more places where we should remove finalize()

> Memory Leak for ActiveMQBytesMessage with Compression as true
> -------------------------------------------------------------
>
>                 Key: AMQ-4182
>                 URL: https://issues.apache.org/jira/browse/AMQ-4182
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: JMS client
>    Affects Versions: 5.5.1
>         Environment: Linux(Redhat 5.5), Windows 7
>            Reporter: Jeff Huang
>            Assignee: Dejan Bosanac
>            Priority: Minor
>             Fix For: 5.10.0
>
>
> InflaterInputStream is supposed to close explicitly to release resource allocated by
its JNI methods. In ActiveMQBytesMessage, dataIn property is disposed simply without closing
it, which results in some weird memory leak that can't be detected from heap size. It can't
be controlled by -Xmx or -XX:MaxDirectMemorySize.
> Please run the following test program to verify the issue:
> import java.util.concurrent.TimeUnit;
> import javax.jms.BytesMessage;
> import javax.jms.Connection;
> import javax.jms.Session;
> import org.apache.activemq.ActiveMQConnectionFactory;
> import org.apache.activemq.command.ActiveMQBytesMessage;
> /**
>  * A simple test to verify memory leak in ActiveMQBytesMessage.
>  */
> public class Main
> {
>     public static void main(String[] args) throws Exception 
>     {
>         ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory("vm://localhost");
>         connFactory.setUseCompression(true);
>         Connection conn = connFactory.createConnection();
>         Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
>         BytesMessage message = session.createBytesMessage();
>         
>         message.writeBytes(new byte[1024]);
>         ActiveMQBytesMessage m = (ActiveMQBytesMessage)message;
>         if(!m.isCompressed())
>         {
>             throw new RuntimeException();
>         }
>         
>         
>         while (true)
>         {
>             for (int k = 0; k < 1024; ++k)
>             {
>                 message.reset();
>                 byte[] data = new byte[1024];
>                 message.readBytes(data);
>             }
>             TimeUnit.MILLISECONDS.sleep(10);
>         }
>     }
> }



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message