2014-09-18 87 views
0

我正在爲壓力測試創建一個應用程序。以1500做到這一點,並通過受審覈方的內部網絡進行1500線程同時連接。在1500圈內被稱爲線程,每個線程在套接字關閉後重新打開並重新發送相同的數據時調用一個套接字。問題是,應用程序給我錯誤,說有無限循環和stackoverflows被提出,但想法是創建Java遞歸調用,但不離開我。我可以做什麼?遞歸線程中的java.lang.OutOfMemoryError

主要類:

public void startStres(){ 

    for(int n = 1; n <= Integer.parseInt(valueThreads.getText().toString()); n++) 
     robots.add(new robot(this, n, valueUrl.getText().toString())); 

    valueTotal.setText(Integer.toString(robots.size())); 

    for(final robot bot : robots) 
     new Thread(new Runnable() { 
      public void run() { 
       bot.start(); 
      } 
     }).start(); 
} 

在Robot類:

public void start(){ 
     context.robotOnConnecting(idUnique); 

     try { 
      socketHandle = new Socket(InetAddress.getByName(dataConnection.host), dataConnection.port); 
      context.robotOnConnect(idUnique); 

      PrintWriter writer = new PrintWriter(socketHandle.getOutputStream()); 
      writer.print(
       "GET " + dataConnection.query + " HTTP/1.1\n" + 
       "Host: " + dataConnection.host + "\n" + 
       "User-Agent: " + dataConnection.userAgent + "\n" + 
       "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n" + 
       "Accept-Language: en-US,en;q=0.5\n" + 
       "Accept-Encoding: gzip, deflate\n" + 
       "Connection: keep-alive\n\n" 
      ); 
      writer.flush(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(socketHandle.getInputStream())); 

      char[] bt = new char[1]; 
      br.read(bt, 0, 1); 
      br.close(); 
      socketHandle.close(); 

      context.robotOnFinish(idUnique); 
      context.robotOnClose(this, idUnique, true); 
      //start(); <-- Error 

     } catch (IOException e) { 
      context.robotOnError(idUnique, e.getMessage()); 
      context.robotOnClose(this, idUnique, false); 

      //start(); <-- Error 
      // e.printStackTrace(); 
     } 
    } 

錯誤:

526-1073/com.x.audits.strestesting D/dalvikvm﹕ GC_FOR_ALLOC freed 16K, 21% free 50827K/63572K, paused 41ms, total 41ms 
526-1095/com.x.audits.strestesting I/dalvikvm﹕ threadid=25: stack overflow on call to Ljava/lang/ThreadLocal;.get:L 
526-1095/com.x.audits.strestesting I/dalvikvm﹕ method requires 28+20+8=56 bytes, fp is 0x761f9314 (20 left) 
526-1095/com.x.audits.strestesting I/dalvikvm﹕ expanding stack end (0x761f9300 to 0x761f9000) 
526-1095/com.x.audits.strestesting I/dalvikvm﹕ Shrank stack (to 0x761f9300, curFrame is 0x761f9488) 
526-1089/com.x.audits.strestesting I/dalvikvm﹕ threadid=19: stack overflow on call to Ljava/lang/ThreadLocal;.get:L 
526-1089/com.x.audits.strestesting I/dalvikvm﹕ method requires 28+20+8=56 bytes, fp is 0x76189314 (20 left) 
526-1089/com.x.audits.strestesting I/dalvikvm﹕ expanding stack end (0x76189300 to 0x76189000) 
526-1089/com.x.audits.strestesting I/dalvikvm﹕ Shrank stack (to 0x76189300, curFrame is 0x76189488) 
526-1089/com.x.audits.strestesting W/dalvikvm﹕ threadid=19: thread exiting with uncaught exception (group=0x418a8898) 
526-1095/com.x.audits.strestesting W/dalvikvm﹕ threadid=25: thread exiting with uncaught exception (group=0x418a8898) 
+0

堆棧溢出? – Unihedron 2014-09-18 22:59:29

回答

1

在處理多線程時,應該使用線程池來避免這種問題。

結賬ThreadPoolExecutor.execute(Runnable)。它可以讓你更好地處理你的多線程。

+0

這應該是一個評論 – 2014-09-18 23:05:05

+0

謝謝,我會發現更多關於它。 – 2014-09-18 23:08:08

+0

已經完全解決了我的問題。這個班甚至可以處理我的電腦硬件,核心數量等,並使其一切工作:) – 2014-09-18 23:44:40

1

簡單:

public void start() { 
    while(true) { 
     doWork(); 
    } 
} 

private void doWork() { 
    // do all the work non recursively 
} 
+0

它的工作原理,但最後30秒有相同的問題,只是關閉並顯示相同的日誌。 – 2014-09-18 23:03:09

+0

再次Stackoverflow? – 2014-09-18 23:04:27

+0

I/dalvikvm-heap:強制收集SoftReferences以進行16400字節的分配 D/dalvikvm:GC_BEFORE_OOM已釋放0K,19%空閒106799K/131064K,暫停175ms,總計175ms E/dalvikvm-heap:16400內存不足字節分配。 – 2014-09-18 23:20:59