jboss7,java.lang.OutOfMemoryError:无法创建新的本机线程

时间:2012-02-20 12:16:05

标签: multithreading jboss

我在我的应用程序中使用jsp-servlet。并在jboss 7.0.2服务器上部署了战争。我有servlet有与数据库相关的代码,并且以秒为单位被调用很多次(比如说500次)。但是对于这么多线程来说,jboss 7.0.2将无法处理这个线程。

我正在使用64位jvm。

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

我在jboss.conf中进行了配置

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

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

server(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;





}

  }

code fot add method

   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 个答案:

答案 0 :(得分:1)

Varsha;

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

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

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

我会考虑以下前提重新考虑您的方法:

  1. 将[Tomcat]线程数限制为100 X处理器数。如果没有线程可以立即处理请求,那么如果您的客户端可以容忍等待而不是错误,则允许大量积压的请求。
  2. 实现一个数据库连接池,该连接池将连接数限制为上述#1的最大并发线程数(以及其他活动所需的内容)。如果数据库在此负载下工作,则可能需要减少连接池大小,并且请求线程必须等待连接。
  3. 一旦您满意地拥有一个可接受调整的应用服务器实例,您就可以通过集群多个节点并实现请求负载平衡来提高可扩展性。
  4. 干杯。

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