activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jean-Yves LEBLEU" <jleb...@gmail.com>
Subject Re: Memory leak in broker when subscribing to a topic using TCP connector + noLocal?
Date Wed, 20 Aug 2008 08:10:17 GMT
Hello all,

I don't know if it is the same case but even if you remove the listener and
set local to false, you get a java.lang.OutOfMemoryError: Java heap space

Here is the trace

Memory Usage:    0    Memory Percent:    0    Send count:    0    Memory:
 5177344
Memory Usage:    0    Memory Percent:    0    Send count:    64    Memory:
 21839872
Memory Usage:    0    Memory Percent:    0    Send count:    160
 Memory:    36556800
Memory Usage:    0    Memory Percent:    0    Send count:    255
 Memory:    66650112
Memory Usage:    0    Memory Percent:    0    Send count:    360
 Memory:    66650112
Memory Usage:    0    Memory Percent:    0    Send count:    474
 Memory:    66650112
Memory Usage:    0    Memory Percent:    0    Send count:    542
 Memory:    66650112
Memory Usage:    0    Memory Percent:    0    Send count:    578
 Memory:    66650112
Exception in thread "ActiveMQ Transport Server Thread Handler:
tcp://localhost:8192" java.lang.OutOfMemoryError: Java heap space
    at
org.apache.activemq.openwire.OpenWireFormat.<init>(OpenWireFormat.java:60)
    at
org.apache.activemq.openwire.OpenWireFormat.<init>(OpenWireFormat.java:66)
    at
org.apache.activemq.openwire.OpenWireFormatFactory.createWireFormat(OpenWireFormatFactory.java:62)
    at
org.apache.activemq.transport.tcp.TcpTransportServer.handleSocket(TcpTransportServer.java:336)
    at
org.apache.activemq.transport.tcp.TcpTransportServer$1.run(TcpTransportServer.java:283)
    at java.lang.Thread.run(Thread.java:619)
Memory Usage:    0    Memory Percent:    0    Send count:    586
 Memory:    66650112
Memory Usage:    0    Memory Percent:    0    Send count:    586
 Memory:    66650112


Here is the test case :

package com.alcatel.proserv.testamqmem;

import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;

import javax.jms.Connection;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.usage.MemoryUsage;
import org.springframework.jms.core.JmsTemplate;

public class BrokerMemoryLeak {

    private int sendCount;
    private BrokerService broker = new BrokerService();
    private Runtime runtime;

    public static void main(String[] args) throws Exception {
        new BrokerMemoryLeak().run();
    }

    private void run() throws Exception {
        runtime = Runtime.getRuntime();
        broker.setPersistent(false);
        broker.addConnector("tcp://localhost:8192");
        broker.start();
        ActiveMQConnectionFactory connectionFactory = (new
ActiveMQConnectionFactory(
                "tcp://localhost:8192"));
        Connection connection = connectionFactory.createConnection();
        connection.start();
        ActiveMQSession session = (ActiveMQSession)
connection.createSession(
                false, Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic("foo");
        MessageConsumer messageConsumer = session.createConsumer(topic);

        TimerTask statusTask = new TimerTask() {

            @Override
            public void run() {
                StringBuffer buf = new StringBuffer();
                MemoryUsage memoryUsage = broker.getSystemUsage()
                        .getMemoryUsage();

                buf.append("Memory Usage:\t").append(memoryUsage.getUsage())
                        .append("\t");
                buf.append("Memory Percent:\t").append(
                        memoryUsage.getPercentUsage()).append("\t");
                buf.append("Send count:\t").append(sendCount).append("\t");

buf.append("Memory:\t").append(runtime.totalMemory()).append("\t");
                System.out.println(buf);
            }

        };

        new Timer().schedule(statusTask, 0, 1000);
        JmsTemplate template = new JmsTemplate();
        template.setConnectionFactory(connectionFactory);
        template.afterPropertiesSet();

        while (true) {

            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("1", new byte[100000]);
            template.convertAndSend(topic, map);
            sendCount++;
            Thread.sleep(1);
        }

    }

}


On Fri, Aug 15, 2008 at 4:08 PM, Hiram Chirino <hiram@hiramchirino.com>wrote:

> I opened issue https://issues.apache.org/activemq/browse/AMQ-1889
> and have committed a fix.  Thanks for the report.. Still looking
> forward for your test case contribution so that the test suite can
> catch this error in the future.
>
> On Fri, Aug 15, 2008 at 8:35 AM, Hiram Chirino <hiram@hiramchirino.com>
> wrote:
> > I just tried out your attached test case and yeah it looks like a
> > problem.  Could you shoot us back an email letting us know that you
> > are willing to contribute the test case to the ASF under the ASL 2.0
> > license so we can include parts of it in test suite?
> >
> > On Mon, Aug 4, 2008 at 6:26 PM, Pieper, Aaron (SAIC)
> > <PieperA@pragmatics.com> wrote:
> >> I'm encountering what appears to be a memory leak in the BrokerService.
> >> The symptom is that the BrokerService's memory usage increases with each
> >> message that is sent to a topic, as though each message is being stored
> >> permanently in memory.
> >>
> >>
> >>
> >> I've included an example which demonstrates the issue. If you run the
> >> included BrokerMemoryLeak.java, you should see the following output:
> >>
> >>
> >>
> >> Memory Usage:     0     Memory Percent:   0     Send count: 0
> >>
> >> Memory Usage:     16016576    Memory Percent:   23    Send count: 16
> >>
> >> Memory Usage:     38039368    Memory Percent:   56    Send count: 38
> >>
> >> Memory Usage:     61063196    Memory Percent:   90    Send count: 61
> >>
> >> Memory Usage:     68070448    Memory Percent:   101   Send count: 68
> >>
> >> Memory Usage:     68070448    Memory Percent:   101   Send count: 68
> >>
> >> Memory Usage:     68070448    Memory Percent:   101   Send count: 68
> >>
> >>
> >>
> >> BrokerService's memory usage climbs steadily until the memory percent
> >> hits 100. Then, messages stop being sent. There are several ways to make
> >> the bug stop happening:
> >>
> >>  * Switch from using a Topic to a Queue
> >>
> >>  * Switch the Broker address to 'vm://foo', so it's not using TCP
> >>
> >>  * Set the third argument in the 'createConsumer' call to false. (the
> >> noLocal argument)
> >>
> >>  * Don't register the MessageListener
> >>
> >>
> >>
> >> I've witnessed this behavior both with ActiveMQ 5.1.0 and the
> >> 5.2-SNAPSHOT version available as of August 4, 2008. I'm using Spring
> >> 2.5.4. Since two-way traffic isn't an issue for this application, I can
> >> fix the issue by setting 'noLocal' to false. However, I wasn't sure
> >> whether I should submit a JIRA tracker for this, or whether I'm doing
> >> something wrong.
> >>
> >>
> >>
> >> Thanks,
> >>
> >>
> >>
> >> - Aaron Pieper
> >>
> >>
> >>
> >> --------------------------------
> >>
> >>
> >>
> >> import java.util.HashMap;
> >>
> >> import java.util.Timer;
> >>
> >> import java.util.TimerTask;
> >>
> >>
> >>
> >> import javax.jms.Connection;
> >>
> >> import javax.jms.Message;
> >>
> >> import javax.jms.MessageConsumer;
> >>
> >> import javax.jms.MessageListener;
> >>
> >> import javax.jms.Session;
> >>
> >> import javax.jms.Topic;
> >>
> >>
> >>
> >> import org.apache.activemq.ActiveMQConnectionFactory;
> >>
> >> import org.apache.activemq.ActiveMQSession;
> >>
> >> import org.apache.activemq.broker.BrokerService;
> >>
> >> import org.apache.activemq.usage.MemoryUsage;
> >>
> >> import org.springframework.jms.core.JmsTemplate;
> >>
> >>
> >>
> >> public class BrokerMemoryLeak {
> >>
> >>      private int                   sendCount;
> >>
> >>      private BrokerService   broker      = new BrokerService();
> >>
> >>
> >>
> >>      public static void main(String[] args) throws Exception {
> >>
> >>            new BrokerMemoryLeak().run();
> >>
> >>      }
> >>
> >>
> >>
> >>      private void run() throws Exception {
> >>
> >>            broker.addConnector("tcp://localhost:8192");
> >>
> >>            broker.setPersistent(false);
> >>
> >>            broker.start();
> >>
> >>
> >>
> >>            ActiveMQConnectionFactory connectionFactory = (new
> >> ActiveMQConnectionFactory("tcp://localhost:8192"));
> >>
> >>            Connection connection =
> >> connectionFactory.createConnection();
> >>
> >>            connection.start();
> >>
> >>
> >>
> >>            ActiveMQSession session = (ActiveMQSession)
> >> connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
> >>
> >>            Topic topic = session.createTopic("foo");
> >>
> >>            MessageConsumer messageConsumer =
> >> session.createConsumer(topic, null, true);
> >>
> >>
> >>
> >>            messageConsumer.setMessageListener(new MessageListener() {
> >>
> >>                  public void onMessage(Message message) {}
> >>
> >>            });
> >>
> >>
> >>
> >>            TimerTask statusTask = new TimerTask() {
> >>
> >>                  @Override
> >>
> >>                  public void run() {
> >>
> >>                        StringBuffer buf = new StringBuffer();
> >>
> >>                        MemoryUsage memoryUsage =
> >> broker.getSystemUsage().getMemoryUsage();
> >>
> >>                        buf.append("Memory
> >> Usage:\t").append(memoryUsage.getUsage()).append("\t");
> >>
> >>                        buf.append("Memory
> >> Percent:\t").append(memoryUsage.getPercentUsage()).append("\t");
> >>
> >>                        buf.append("Send
> >> count:\t").append(sendCount).append("\t");
> >>
> >>                        System.out.println(buf);
> >>
> >>                  }
> >>
> >>            };
> >>
> >>
> >>
> >>            new Timer().schedule(statusTask, 0, 1000);
> >>
> >>
> >>
> >>            JmsTemplate template = new JmsTemplate();
> >>
> >>            template.setConnectionFactory(connectionFactory);
> >>
> >>            template.afterPropertiesSet();
> >>
> >>
> >>
> >>            while (true) {
> >>
> >>                  HashMap<String, Object> map = new HashMap<String,
> >> Object>();
> >>
> >>                  map.put("1", new byte[1000000]);
> >>
> >>                  template.convertAndSend(topic, map);
> >>
> >>                  sendCount++;
> >>
> >>                  Thread.sleep(1);
> >>
> >>            }
> >>
> >>      }
> >>
> >> }
> >>
> >>
> >
> >
> >
> > --
> > Regards,
> > Hiram
> >
> > Blog: http://hiramchirino.com
> >
> > Open Source SOA
> > http://open.iona.com
> >
>
>
>
> --
> Regards,
> Hiram
>
> Blog: http://hiramchirino.com
>
> Open Source SOA
> http://open.iona.com
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message