2012-09-18 2 views
3

C#, Framework 4에 응용 프로그램이 있습니다. 기본적으로이 응용 프로그램은 주로 이벤트에 반응하고 개체를 만들고 릴리스하고 데이터베이스 연결을 만들고 닫습니다.C# 응용 프로그램에서 메모리 누수 찾기

이제 우리는 애플리케이션의 프로세스가 때로는 매우 이상하게 성장한다는 것을 알았습니다.

  1. 일반적으로 응용 프로그램은 대략 "500MB"로 유지되어야 할 때 RAM에서 최대 4GB까지 응용 프로그램이 커집니다. 결과 -> 충돌!
  2. 응용 프로그램은 최대 1200MB (30 분)까지 천천히 성장한 다음 갑자기 500MB (1 초)로 축소됩니다.이 과정은 매 순간 반복됩니다. 이것이 가비지 컬렉터가 될 수 있습니까?

이제 응용 프로그램에 대한 자세한 정보를 제공하기 위해 응용 프로그램 프로세스의 크기를 로그 파일에 추가하고 싶습니다. 네이티브 프레임 워크를 통해 가능합니까? C#에서 객체의 크기를 알 수 있습니까?

응용 프로그램 NetMemoryProfiler4도 발견되었지만 가능한 경우 포함 된 로깅을 사용하는 것이 좋습니다!

+2

실례지만 내 모르기를 '모'라고합니까? – Adam

+0

메모리 프로파일 러를 사용하면 더 많은 정보를 얻을 수 있으며 로깅보다 누출을 훨씬 효과적으로 타겟팅 할 수 있습니다. – Oded

+2

메가 오트에 대해 들어 본 적이 없습니까? –

답변

5

이러한 문제를 디버깅하려면 메모리 프로파일 러가 필요합니다. 예를 들어 : ANTS Memory Profiler

  • CLR Profiler
  • .Net Memory Validator
  • GlowCode
  • 또한 the other question about memory leaks에서 제안을 참조하십시오.

    기본적으로 이것은 메모리에있는 개체를 찾는 것과 관련이 있습니다. 클래스에 대한 참조 또는 부모에 대한 참조를 보유하는 객체의 콜렉션을 보유하는 이벤트 핸들러 일 수 있습니다. 근본 원인을 찾은 후 불필요한 참조를 없애기 위해 응용 프로그램을 다시 구성해야 할 수 있습니다. 이것은 잊어 버린 이벤트 구독 취소를 추가하는 것만 큼 간단 할 수 있지만, 사소한 경우에는 일부 구조 설계 패턴을 적용해야 할 수도 있습니다. 이 부분은 응용 프로그램별로 매우 다양합니다.

0

아마도 클래스가 검색중인 올바른 것입니다.
Process myProcess = Process.GetCurrentProcess()을 사용하면 현재 처리 중입니다.
그런 다음 WorkingSet64, PrivateMemorySize64 등과 같이 myProcessproperties을 사용할 수 있습니다.