activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Filip Hanik - Dev Lists <devli...@hanik.com>
Subject Re: java.lang.OutOfMemoryError: unable to create new native thread on AMQ 5.0
Date Mon, 19 May 2008 16:09:32 GMT
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 <tuler@ideais.com.br> 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.
>>
>>
>>     
>
>
>
>   


Mime
View raw message