2011-10-12 1 views
2

매우 특이한 문제가있는 응용 프로그램을 실행하고 있습니다. 갑자기 관리되지 않는 메모리가 성장하고 빠르게 성장하기 시작합니다. 30 분 정도 지나면 앱이 충돌합니다..NET 응용 프로그램에서 갑자기 관리되지 않는 메모리가 급증합니다.

응용 프로그램이 관리되지 않는 DLL을 사용하고 있지 않습니다. 그것은 외부 응용 프로그램과 통신하고 있습니다. 그것은 소켓 (스트림을 통해 사용)과 WCF 스트림을 통해 읽는 중입니다.

ANTS로 프로파일 링했습니다. 관리되지 않는 메모리 사용량의 갑작스러운 변화는 매우 놀랍습니다. 영원히 완벽하게 평평한 상태를 유지하고 갑자기 상승하기 시작하고 응용 프로그램이 실패 할 때까지 꾸준한 속도로 계속 진행합니다. 관리되는 메모리의 아무 것도 보이지 않습니다.

의도적으로 관리되지 않는 코드를 사용하고 있지 않다는 것을 감안할 때 누수가 어디에서 왔는지 파악하기가 어렵습니다. 개미는 도움이되지 않습니다. 처음부터 꾸준히 증가하지 않는 문제에 대해서는 코드를 닦아 내기가 어렵습니다 (이 애플리케이션은 아주 작은 비트의 데이터로 소켓을 초당 1 회씩 핑합니다.)

다시 반복하려면이 시간 동안 응용 프로그램과 서버가 모두 유휴 상태 여야합니다. 이것은 고립 된 테스트 시스템 (서버와 클라이언트 모두)에서 실행 중이다. 클라이언트가 누수 중입니다.

+1

이것은 도움이 될 수 있습니다. http://stackoverflow.com/questions/1180649/how-to-find-dispose-and-memory-issues-c – hatchet

+0

특정 페이지 나 클래스로 범위를 좁힐 수 있었습니까? –

+0

호기심에서 얼마나 빨리 성장합니까? 초당 데이터의 양이 매우 적습니다. –

답변

3

아마도 DebugDiag를 사용하여 메모리 누수를 모니터링하고 할당 된 내용, 통화량 및 호출 스택 정보를 제공 할 수 있습니다. 한마디로 :

  1. 열기 DebugDiag를 : 프로세스가 시작 (또는 다시 시작) 직후

    다음을 수행합니다.

  2. 마법사를 취소하십시오.
  3. 프로세스 탭으로 이동하십시오.
  4. 원하는 프로세스를 마우스 오른쪽 단추로 클릭하십시오.
  5. 모니터 누출을 선택하십시오.
  6. 확인을 클릭하십시오. 과정 후

잠시 동안 실행되어, 메모리 문제는 분명하다 : 그것은 아직 열려 있지 않으면

  1. 이동 마법사에서 취소,
  2. 을 DebugDiag 할 수 있습니다.
  3. 프로세스 탭으로 이동하십시오.
  4. 파트 1과 동일한 프로세스를 마우스 오른쪽 단추로 클릭하십시오.
  5. 전체 사용자 덤프 생성을 선택하십시오.
  6. 덤프 위치를 기록하십시오.

또한 메모리 덤프가 캡처되기 전에 프로세스가 다시 시작되면 누수 모니터링을 다시 설정해야합니다.

덤프가 있으면 :

  1. 는 DebugDiag로 이동합니다.
  2. "고급 분석"탭으로 이동하십시오.
  3. "MemoryAnalysis.asp"스크립트를 위로 선택하십시오.
  4. 하단의 "Add Data Files"를 클릭하고 이전에 생성 된 덤프를 선택하십시오.
  5. "분석 시작"을 클릭하고 결과를 살펴보십시오.

정보를 얻은 후에는 메모리 할당의 출처와 문제의 원인을 파악할 수 있어야합니다.

당신은 다음 리소스에서 자세한 정보를 찾을 수 있습니다 :

0

우리는 결국 문제를 발견했다. 우리는이 둘 사이에 소켓 연결이 있음을 알았고, 유휴 단계에서 리스너가 자동 연결 해제되지 않도록 KeepAlive 패킷을 보냈습니다. 그러나 일정 시간 동안 유휴 상태가 된 후 WCF를 사용하여 특이한 시간 초과가 발생하면 소켓이 서버 쪽에서 닫히고있었습니다.

기본적으로 DispatchTimer가 실행될 때마다 연결 유지 패킷이 소켓에 기록되지만 분명히 차단됩니다. 이렇게하면 다음 DispatchTimer가 똑같은 일을하지 않게됩니다. 그게 더 큰 것 같았지만 그 작은 패킷은 빠르게 관리되지 않는 메모리를 모두 차지하면서 소켓을위한 버퍼를 추정했습니다. (우리가 연결에 NetworkStream을 사용하고 있었다고 생각합니다). 논리가 조금씩 바뀌면서 문제는 사라졌습니다.

모든 입력에 감사드립니다.