Do you get the same sort of behavior if you point your pub/sub client to an
external broker?
Joe
www.ttmsolutions.com
Aaron Pieper 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);
>
> }
>
> }
>
> }
>
>
>
--
View this message in context:
http://www.nabble.com/Memory-leak-in-broker-when-subscribing-to-a-topic-using-TCP-connector-%2B-noLocal--tp18821110p18823693.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.