관리 메뉴

KorSA

C# Memory Leak 해결 툴 본문

Development Experience/C#

C# Memory Leak 해결 툴

Praiv. 2019. 10. 7. 15:22
320x100

Memory Leak을 측정하는 방식 중 2가지를 발견하였다.
하나는 perfMon을 사용하는 방식이고,
다른 하나는 Memory Profiler를 사용하는 방식이다.

[ perfMon ]

1.
Task Manager 는 정확한 성능 상태를 측정하지 못한다. 
사용하는 메모리가 아닌 할당된 메모리를 보여주고 그마저도 다른 프로세스에서 사용하고 있을 수 있다.


2.
프로세스에서만 사용하는 메모리를 보기 위해서 private bytes 를 보아야 한다.

이는 performance counter를 통해 볼 수 있다.


3.
메모리 릭이 발생한다면 3가지를 알아보아야 한다.
  1) What ? managed 메모리 릭인지, unmanaged 메모리 릭인지
  2) How ? connection object 때문인지, 파일 핸들러가 close 되어 있지 않은지 등
  3) Where ? 어느 함수, 어느 코드에서 발생하는지

 


4. 어떤 종류의 Memory Leak인가?
Total memory = Managed memory + Unmanaged memory

private bytes는 application에서 사용하는 total memory이다.
Managed memory에서 사용하는 byte들을 보고 싶다면, 성능카운터에서 Bytes in all heaps 값을 보면 된다.
Unmanaged memory에서 사용하는 byte들을 보고 싶다면, total memory - Bytes in all heaps 값을 계산하면 된다.
따라서,
Private bytes가 증가하는데 Bytes in all heaps는 그대로라면, 이는 Unmanaged memory leak이다.
Private bytes가 증가하는데 Bytes in all heaps도 증가한다면, 이는 Managed memory leak이다. 


5. Memory leak의 원인은 무엇인가?
Marshal.AllocHGlobal() 함수는 unmanaged memory를 할당하는 함수이다.
유용한 툴> debugdiag


6. Memory leak이 발생하는 지점은 어디인가?
어느 코드에서 memory leak이 발생하는지 알려면 직접 코드를 보는 수밖에 없다.
debugdiag툴을 사용하면서 코드를 따라가는 방식으로 memory leak이 발생하는 코드를 알 수 있다.
(아직 써보질 않아서 자세한 설명은 힘듦..)

 

참고> https://www.codeproject.com/Articles/42721/Best-Practices-No-5-Detecting-NET-application-memo


[ Memory Profiler ]


위의 방식은 Windows에서 제공하는 perfMon (성능 모니터) 프로그램을 사용한 memory leak detection 방식이다.
하지만 perfMon은

GC가 아직 memory를 수거하지 않았을 뿐인 상황을 memory leak으로 오해할 수 있다는 점, 

내 프로그램이 아닌 다른 프로그램에서 발생하는 memory leak을 분간하기 어려울 수 있다는 점 

등의 이유로 악명이 높다. 

Michael's Coding Spot 블로그에서는 perfMon대신에 .NET memory profiler을 사용하길 권한다. 

유명한 .NET memory profiler는 dotMemory, SciTech Memory Profiler, ANTS Memory 등이 있다. 

만일 VS Enterprise 버전을 사용하고 있다면 무료 memory profiler를 사용할 수도 있다. 

이들 memory profiler들은 대개 비슷한 방식으로 작동한다.


7. GC Root
GC Root는 GC가 메모리를 해제하지 못하는 object이다.
따라서, GC Root 가 참조하는 object들도 당연히 GC에서 메모리를 해제하지 못한다.
현재 쓰레드에서 사용중인 static object들이나 local object들이 그 예이다.

 

참고> https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/

728x90
728x90
Comments