[
https://issues.apache.org/jira/browse/AMQ-4182?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13506880#comment-13506880
]
Jeff Huang commented on AMQ-4182:
---------------------------------
Unfortunately, I don't have a solution for that. I would tend to say that there
is not a valid solution for that.
We could try to add a close() or release() method to ActiveMQBytesMessage, but
I don't think the users are going to call it because it is not part of the JMS
API.
Or we can try to find another pure Java compression library to avoid the need
to release the resource explicitly. But that may probably mean we need to
sacrifice some performance when doing compression.
Or we may want to decompress the whole buffer, instead of remaining a stream
for it. The memory footprint would be bigger, but comparing to blowing out the
whole system, this is acceptable.
Or we can call off this feature. Tell the users not to use BytesMessage in
ActiveMQ when they try to use compression.
> 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
> Priority: Minor
>
> 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 is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira