2014-09-18 31 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