2011-03-24 26 views
0

我目前正在加載測試activemq的默認REST API。 我所有的100位用戶都會盡可能快地將相同的消息文本寫入同一目的地。幾秒鐘後,我得到:ActiveMQ:outOfMemoryError:無法創建新的本地線程

java.lang.OutOfMemoryError: unable to create new native thread 
     at java.lang.Thread.start0(Native Method) 
     at java.lang.Thread.start(Thread.java:640) 
     at org.apache.activemq.thread.TaskRunnerFactory.execute(TaskRunnerFactory.java:92) 
     at org.apache.activemq.thread.TaskRunnerFactory.execute(TaskRunnerFactory.java:85) 
     at org.apache.activemq.broker.TransportConnector$1.onAccept(TransportConnector.java:211) 
     at org.apache.activemq.transport.vm.VMTransportServer.connect(VMTransportServer.java:91) 
     at org.apache.activemq.transport.vm.VMTransportFactory.doCompositeConnect(VMTransportFactory.java:145) 
     at org.apache.activemq.transport.vm.VMTransportFactory.doConnect(VMTransportFactory.java:53) 
     at org.apache.activemq.transport.TransportFactory.doConnect(TransportFactory.java:51) 
     at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:80) 
     at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:243) 
     at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:258) 
     at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:230) 
     at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:178) 
     at org.apache.activemq.web.WebClient.getConnection(WebClient.java:246) 
     at org.apache.activemq.web.WebClient.createSession(WebClient.java:348) 
     at org.apache.activemq.web.WebClient.getSession(WebClient.java:239) 
     at org.apache.activemq.web.MessageServletSupport.getDestination(MessageServletSupport.java:319) 
     at org.apache.activemq.web.MessageServletSupport.getDestination(MessageServletSupport.java:267) 
     at org.apache.activemq.web.MessageServlet.doPost(MessageServlet.java:110) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:527) 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1216) 
     at org.apache.activemq.web.SessionFilter.doFilter(SessionFilter.java:45) 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) 
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:421) 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:493) 
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) 
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:930) 
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:358) 
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) 
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:866) 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:456) 
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 
     at org.eclipse.jetty.server.Server.handle(Server.java:351) 
     at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594) 
     at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1059) 
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:764) 
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) 
     at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436) 
     at java.lang.Thread.run(Thread.java:662) 

因爲我已經有10G heapspace運行,只有模擬10級REST的用戶我不明白爲什麼ActiveMQ是產生8000個線程。我希望有人能幫我解決這個問題。

回答

1

此內存泄漏的原因在於activemq的連接處理。默認的servlet爲每個httpsession創建一個連接(這是一個非常糟糕的主意)。我的loadtesting工具不關心會話,也不會發送會話標識。所以每條發送的消息都是一個新的連接,是一個新的線程,在17.000個線程之後,jvm就完成了。

基本上,我要寫一個新的servlet,每個工作線程使用一個連接。這應該將線程限制在最低限度。

+0

+1。我們正面臨同樣的問題 「我要寫一個新的servlet,每個工作線程使用一個連接,這應該限制線程數最低限度」你能解釋一下你是如何實現這個的 – 2015-03-27 08:03:58

相關問題