9

AWS의 웹 서비스에서 많은 콘텐츠를 다운로드하는 복잡한 앱이 있습니다. 그러나, 나는 계속 SocketTimeoutException의 50 %를 얻고있다. 나는 100 초로 증가하지만, 여전히이 오류가 점점 계속 :SocketTimeoutException Android

  • 타임 연결 시간 초과가 작 : 내 연구를 바탕으로, 나는 이유가 다음 될 수 있다고 생각한다.
  • 메모리 누수 : 계속해서 GC 경고를 받고 있습니다. 기사를 읽고 코드 개선을 시도했지만 도움이되지 않습니다. 또한 내 응용 프로그램이 백그라운드 스레드에서 다른 파일을 차례로 다운로드하여 2000+ 30KB JSON 파일을 다운로드한다고 언급해야합니다. 이것을 효율적으로 즉흥적으로 제안하는 것이 매우 환영받을 것입니다!
  • 서버 문제 : Amazon Web Service는 신뢰성이 높기 때문에 근본적인 문제가 아닐 수도 있습니다.
  • 다중 스레드 : 어떻게 든 책임을 질 수 있습니까?
  • 잘못된 다운로드 방법 : 나는 비효율적 인 방식으로 다운로드 할 것인지 의심 스럽습니다. 틀 렸으면 고쳐줘.

실제 문제를 파악하는 데 도움주세요. 감사 !

public synchronized String getJSONString(String url) 
{ 
    try { 
      URL url1 = new URL(url); 
      URLConnection tc = url1.openConnection(); 
      tc.setConnectTimeout(timeout); 
      tc.setReadTimeout(timeout); 
      // tc.connect(); 
      br = new BufferedReader((new InputStreamReader(tc.getInputStream())),8000); 
      while ((line = br.readLine()) != null) { 
        sb.append(line+"\n"); 
       } 
       br.close(); 
       json = sb.toString(); 
       return json; 
     } 
    catch(Exception e) 
    { 
     Log.e("JSON Downloader", "Error downloading feed/article "); 
     e.printStackTrace(); 
    } 

    return null; 
} 

오류 로그 :

02-01 06:37:43.375: W/System.err(5548): java.net.SocketTimeoutException 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.InputStream.read(InputStream.java:163) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.io.Streams.readAsciiLine(Streams.java:201) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:784) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONString(JSONDownloader.java:65) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONObjectFromUrl(JSONDownloader.java:45) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.fullarticle.ArticlePage$LoadArticle.run(ArticlePage.java:383) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-01 06:37:43.375: W/System.err(5548):  at java.lang.Thread.run(Thread.java:856) 

답변

1

내가이 함께 일 동안이지만, 하나 개의 기사는 정말 성능 찾을 때 읽을 것을 권장합니다 : http://www.kegel.com/java/wp-javaio.html

연결 시간 초과 수 서버 측에서 야기 될 수 있습니다. 웹 서버에 연결되었다고 가정 할 때 어떤 오류가 있는지 확인하십시오.

GC 문구는 놀라운 것이 아닙니다. 이것은 메모리 누수가 아니라 Java 정리입니다. 기사 위에서 :

첫째, 우리는 while 루프의 첫 번째 줄에 보면, 우리는 새로운 String 객체를 읽을 파일의 모든 행에 대해 생성되고 있음을 참조하십시오

동안 (({

예를 들어, 100,000 라인 파일의 경우 100,000 개의 String 객체가 생성된다는 것을 의미합니다. 많은 수의 오브젝트를 작성하는 데는 세 가지 f}이 있습니다. 오브젝트에 대한 공간을 할당하는 시간과 메모리, 오브젝트를 초기화하는 시간, 오브젝트를 가비지 수집하는 시간.

다중 스레드와 관련하여 좀 더 많은 코드를 제공해야합니다. 메소드가 동기화되므로 적어도 같은 인스턴스에서 동시에 여러 번 호출하지 않아도됩니다. NW 코드는 빠른 시일 내에 안전합니다.

제 디버깅 전략은 입력 라인을받을 때 서버 측 첫 번째 및 두 번째 저장 타임 스탬프를 확인하여 발생하는 갭 (전송 오류)이 있는지 확인하는 것입니다.

행운을 빌어 요.