so it seems there are two OOME problems

either you hit java heap space error, or if you have increased your -Xmx very high, you'll run into OOME caused by not enough mem for the number of threads it tries to create.

the two errors are directly related to each other, increasing -Xmx (java heap) will effectively reduce the amount of memory for thread stacks

in the test case provided, that assumes it tries to create a thread for each topic, in his case, 5000 threads, on 32bit windows, all I have to do is set -Xmx1024m which will limit my thread count to less than 5000, and you'll see the error "unable to create native thread"

Filip

Hiram Chirino wrote:
I modified your case so that it's a JUnit test and so that it starts
an embedded broker.. I did not see the threading problem against the
trunk, but I did see :

javax.jms.JMSException: Java heap space
        at 
org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
        at 
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1201)
        at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1648)
        at 
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:227)
        at 
org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:300)
        at org.apache.activemq.App.testSend(App.java:34)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at junit.framework.TestCase.runTest(TestCase.java:154)
        at junit.framework.TestCase.runBare(TestCase.java:127)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:118)
        at junit.framework.TestSuite.runTest(TestSuite.java:208)
        at junit.framework.TestSuite.run(TestSuite.java:203)
        at 
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
        at 
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
        at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
        at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
        at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.OutOfMemoryError: Java heap space
        at 
org.apache.activemq.util.DataByteArrayOutputStream.<init>(DataByteArrayOutputStream.java:45)
        at 
org.apache.activemq.kaha.impl.index.hash.HashIndex.load(HashIndex.java:246)
        at 
org.apache.activemq.kaha.impl.container.MapContainerImpl.load(MapContainerImpl.java:107)
        at 
org.apache.activemq.store.kahadaptor.KahaPersistenceAdapter.getSubsMapContainer(KahaPersistenceAdapter.java:222)
        at 
org.apache.activemq.store.kahadaptor.KahaReferenceStoreAdapter.createTopicReferenceStore(KahaReferenceStoreAdapter.java:171)
        at 
org.apache.activemq.store.amq.AMQPersistenceAdapter.createTopicMessageStore(AMQPersistenceAdapter.java:456)
        at 
org.apache.activemq.broker.region.DestinationFactoryImpl.createDestination(DestinationFactoryImpl.java:94)
        at 
org.apache.activemq.broker.region.AbstractRegion.createDestination(AbstractRegion.java:425)
        at 
org.apache.activemq.broker.jmx.ManagedTopicRegion.createDestination(ManagedTopicRegion.java:56)
        at 
org.apache.activemq.broker.region.AbstractRegion.addDestination(AbstractRegion.java:120)
        at 
org.apache.activemq.broker.region.RegionBroker.addDestination(RegionBroker.java:266)
        at 
org.apache.activemq.broker.BrokerFilter.addDestination(BrokerFilter.java:141)
        at 
org.apache.activemq.advisory.AdvisoryBroker.addDestination(AdvisoryBroker.java:147)
        at 
org.apache.activemq.broker.BrokerFilter.addDestination(BrokerFilter.java:141)
        at 
org.apache.activemq.broker.MutableBrokerFilter.addDestination(MutableBrokerFilter.java:148)
        at 
org.apache.activemq.broker.region.RegionBroker.send(RegionBroker.java:425)
        at 
org.apache.activemq.broker.TransactionBroker.send(TransactionBroker.java:224)
        at org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:125)
        at 
org.apache.activemq.broker.CompositeDestinationBroker.send(CompositeDestinationBroker.java:95)
        at 
org.apache.activemq.broker.MutableBrokerFilter.send(MutableBrokerFilter.java:132)
        at 
org.apache.activemq.broker.TransportConnection.processMessage(TransportConnection.java:437)
        at 
org.apache.activemq.command.ActiveMQMessage.visit(ActiveMQMessage.java:624)
        at 
org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292)
        at 
org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:180)
        at 
org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:104)
        at 
org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:68)
        at 
org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:205)
        at 
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
        at 
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
        at java.lang.Thread.run(Thread.java:613)

If you run my modified test case do you still see the threading issue?

Here's my new test case:

package org.apache.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import junit.framework.TestCase;

public class App extends TestCase {

    Connection conn;

    @Override
    protected void setUp() throws Exception {
        ConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost");
        conn = cf.createConnection();
    }

    @Override
    protected void tearDown() throws Exception {
        conn.close();
    }

    public void testSend() throws JMSException {
        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(null);
        for (int i = 0; i < 5000; i++) {
            Destination destination = session.createTopic("TOPIC" + i);
            TextMessage message = session.createTextMessage("");
            producer.send(destination, message);
            System.out.println("Sent: " + i+": "+Thread.activeCount());

        }
        producer.close();
    }
}

On Fri, May 16, 2008 at 2:29 PM, Danilo Tuler <[EMAIL PROTECTED]> wrote:

Hiram Chirino wrote:
Still it would be nice if you could create a test case that shows the
problem and submit it so we can get to the root of the problem.

The attached code shows the problem.
With UseDedicatedTaskRunner=false it works ok.

http://www.nabble.com/file/p17281318/App.java App.java

--
View this message in context: 
http://www.nabble.com/java.lang.OutOfMemoryError%3A-unable-to-create-new-native-thread-on-AMQ-5.0-tp17005441s2354p17281318.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.






Reply via email to