2012-02-20 110 views
0

我在我的应用程序中使用jsp-servlet。并在jboss 7.0.2服务器上部署了这场战争。我有servlet有与数据库相关的代码,并被称为许多时间在秒(比如说500次)。但是对于这么多的线程来说,jboss 7.0.2将无法处理这些线程。jboss7,java.lang.OutOfMemoryError:无法创建新的本地线程

我正在使用64位jvm。

我用-Xss256k减少了线程堆栈的大小,这对我不起作用。

我的确在jboss.conf

wrapper.java.additional.10 = -XX配置:ThreadStackSize = 256K

我需要处理上jboss7的2000多个线程。

服务器(jboss7.0.2)引发异常。

java.lang.OutOfMemoryError: unable to create new native thread 

at java.lang.Thread.start0(Native Method) 

at java.lang.Thread.start(Unknown Source) 

这里是我的servlet java.lang.OutOfMemoryError:无法创建新的本地线程

public class Test extends HttpServlet { 

private static final long serialVersionUID = 1L; 



public Test() { 

    super(); 

} 



protected void doGet(HttpServletRequest request, 

      HttpServletResponse response) throws ServletException, IOException { 

    processRequest(request, response); 

} 



protected void doPost(HttpServletRequest request, 

     HttpServletResponse response) throws ServletException, IOException { 

    processRequest(request, response); 

} 



public void processRequest(HttpServletRequest request, 

     HttpServletResponse response) { 

    Logger log=LoggerFactory.getLogger(feedback.class); 



     /* here is my code to insert the data in database. */ 



      TestClass testobj = new TestClass();  



      testobj.setparam(""); 





    smsmanager1.add(sms); 



    smsmanager1 = null; 

    sms = null; 





} 

    } 

代码FOT添加方法

public void add(T obj) { 

     SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 

     Session session=sessionFactory.openSession(); 

     Transaction transaction = null; 

     try { 

       transaction = session.beginTransaction(); 

       session.save(obj); 

       transaction.commit(); 

       session.flush(); 



     } catch (HibernateException e) { 

      if(transaction!=null){ 

       transaction.rollback();} 

       e.printStackTrace(); 

     } finally { 

      if(session!=null){ 

       session.close();} 

       session = null; 

       transaction = null; 

     } 

我为有空白的servlet测试唯一一个控制台打印语句。它工作正常,但它不适用于上面的servlet。

我在正确的轨道上吗?

服务器如何处理500-800线程以上的这种servlet?

回答

1

Varsha;

2000线程听起来像太多的线程。你没有提到你的目标机器有多少处理器,但我相信对于Tomcat来说,每个处理器的经验最大值大约是200-250,所以保守地说,你需要10个[reserved(+)]处理器来支持2000个并发线程。

(+)我说保留,因为显然你也需要其他的东西的处理器容量。

更重要的是,请记住,每个线程都需要获取,使用和释放数据库连接,所以您的应用程序服务器或数据库不太可能实现或维持这种吞吐量。如果您只是试图分配这些资源,那么您将淹没您的系统,并开始获得类似您列出的错误。

我会重新考虑你的方法与注意以下前提:

  1. 限制[Tomcat的]线程100×处理器数量的数量。如果客户端可以容忍等待而不是错误,如果没有线程立即可用于处理请求,则允许大量的请求积压。
  2. 实现一个数据库连接池,该连接池将连接数限制为上述#1中并发线程的最大数量(加上其他任何活动所需的任何其他线程)。如果数据库在此负载下强调,则可能需要减小连接池大小,并且请求线程将不得不等待连接。
  3. 一旦您满意,您就拥有了一个可接受的优化的应用服务器实例,您可以通过群集多个节点并实现请求负载均衡来提高可伸缩性。

干杯。

PS。这是一个good presentation关于如何计算满足特定数量和流量内容所需节点的数量。

相关问题