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 <[EMAIL PROTECTED]> 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)
> <[EMAIL PROTECTED]> 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

Reply via email to