구분 | 팁&트릭 |
---|---|
출처 | 내가작성 |
C#은 자기 혼자 메모리 관리를 한다. (GC라 불리우며, Gabage Collection이 알아서 쓰지않는 메모리를 없애는 역할을 한다.)
고로, 코드로 메모리를 해제하는 짓을 할 수가 없다.
그런데, 단순히 VB나 MFC로 코딩하면 메모리 사용량이 1메가도 안나오는 실행파일임에도 불구하고
처음 실행하자마자 70메가를 사용하는 것으로 나오는 이 이상한 현상은 무엇일까?
아무리 닷넷 플랫품을 사용한다고 해도 말이다.
더 신기한 것은 이 70메가를 사용하는 프로그램을 최소화하면 2메가로 줄어든다는 것이다. 물론 다시 1~20메가로 올라간다.
이 역활을 하는 코드는 다음과 같다.
Process curProc = Process.GetCurrentProcess();
curProc.MaxWorkingSet = curProc.MaxWorkingSet;
curProc.MaxWorkingSet = curProc.MaxWorkingSet;
워킹셋을 초기화하는 코드이다. 워킹셋은 프로세스에서 자주 사용되는 페이지의 집합으로 가상메모리 캐시라고 보면된다.
위 코드에서처럼 재설정 시 일시적으로 캐시가 삭제되고 메모리가 줄어드는 것처럼 보이지만 잠시뒤에 다시 캐시가 채워지면서
메모리가 증가한다는 것이다.
이 70메가를 사용하는 이 프로그램은 어이없게도 메모리 Leak현상까지 나타난다. 단순히 TCP/IP로 메시지 받아서 파일로 저장만 하는
프로그램이다. 이렇다는 이야기는 GC가 관리하는 영역외의 일이라는 소리다. C#은 메모리 해제가 불가능하다고 나와있는데
이를 어찌하면 좋단 말인가?
그래서 문제해결을 위해 포스트를 해본다. 언젠가 해결될 것이니... (지금 해결은 안됨, 이유와 방법을 모름 T_T)
http://msdn.microsoft.com/ko-kr/magazine/cc163491.aspx - 관리 코드에서 메모리 누수 확인 및 방지 by James Kovac
http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=40743 - 효과적인 C# 메모리관리기법 by 조명근