2014-04-29 1 views
0

주기적으로 TCP 서버를 폴링하고 일부 사용자 데이터 (JSON 표기법)를 다운로드하는 WinForm 응용 프로그램이 있습니다. 어떤 이유로, 아래의 방법의 모든 호출이 응용 프로그램 증가 메모리 사용의 경우 : wc.DownloadString가 호출 될 때마다WebClient.DownloadString()에 메모리 누수/할당 문제가 있습니까?

private void timerElapsed(object sender, ElapsedEventArgs e) 
    { 
     if (!isPolling) 
     { 
      isPolling = true; 

      try 
      { 
       using (System.Net.WebClient wc = new System.Net.WebClient()) 
       { 
        jsonTemp = wc.DownloadString(serverUrl); 

        isPolling = false; 
       } 
      } 
      catch (Exception ex) 
      { 
       isPolling = false; 
      } 
     } 
     else 
     { 
      isPolling = false; 
     } 
    } 

, 내 응용 프로그램 증가의 풋 프린트.

WebClient에서 IDisposable을 이미 구현 했으므로 using 지시문 뒤에 자동으로 처리되어야합니까, 아니면 잘못 되었습니까?

+0

: IDisposable와 GC에 관해서는

, 나는이 대답있어? 가상 메모리는 예를 들어 가비지 수집기가 처리 할 때도 많은 임시 개체를 생성하여 증가 할 수 있습니다. 필요하지 않을 수도 있기 때문에 시스템에 반환되지 않습니다. –

+0

현재 Windows 작업 관리자에서만 값을 관찰하고 있습니다. 그러나 또한 .Net 메모리 프로파일 러는 증가하는 값을보고합니다. 추가 정보를 얻으려면 perfmon을 사용하여 메모리 사용량을 다시 확인하십시오. – lenniep

+2

예, perfmon 분석을 계속하고 프로그램을 오래 실행 한 후 전체 메모리 덤프를 수행합니다 (명확한 상황이 있음). –

답변

1

음, 예상됩니다. 메모리 사용량은 가비지 수집 후에 만 ​​감소합니다. 이것은 C 나 Pascal이 아닙니다. 변수가 범위를 벗어나거나 메모리가 메모리 압력 하에서 만 해제 될 때 메모리가 해제되지 않습니다. .NET 모델은 할당량이 매우 싸고 콜렉션은 상대적으로 비쌉니다. 실제로 얼마나 많은 양의 메모리가 남아 있는지에 따라 달라지지 않습니다. 따라서 MiB를 약간 희생하여 메모리에있는 쓰레기를 조금 더 오래 보관하고 컬렉션을 100 번 수행하지 않고 한 번에 100 개의 객체를 릴리스하는 것이 훨씬 빠릅니다).

얼마나 큰 숫자입니까? MiB는 염려 할 사항이 아니며 평균 (수십만 건이 넘는 통화)을 꾸준히 오르는 경우에만 누출을 찾아야합니다. 또한 어떤 종류의 기억을하고 있습니까? 개인 메모리? 가상 메모리? 약속 한 기억?

메모리에 고정 된 핸들이있는 동안 가비지 수집이 시작되면 힙 압축으로부터 힙 압축을 방지하여 메모리 누수가 발생할 수 있습니다. 이것을 CLRProfiler에서 아주 쉽게 볼 수 있습니다. 그러나 힙 조각화가 너무 많이 발생하는 경우에만이 작업이 중요합니다. 어떻게 메모리 사용량을 확인하는 Does the "using" keyword mean the object is disposed and GC'ed?

+0

응답이 전혀없는 것보다 지연된 응답이 더 좋습니다. Luaan은 올바른 방향을 지적했습니다. GC가 여러 날 동안 테스트를 실행하는 동안 객체를 조금 더 오래 살게하는 것처럼 보입니다. 메모리 사용량은 멈추었습니다. – lenniep

관련 문제