2012-02-20 109 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關於如何計算滿足特定數量和流量內容所需節點的數量。

相關問題