본문 바로가기
C#
2014.01.27 13:43

C# 메모리 관련

다물칸 주소복사
조회 수 2611 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
구분 팁&트릭
출처 내가작성
C#은 자기 혼자 메모리 관리를 한다. (GC라 불리우며, Gabage Collection이 알아서 쓰지않는 메모리를 없애는 역할을 한다.)
고로, 코드로 메모리를 해제하는 짓을 할 수가 없다.
 
그런데, 단순히 VB나 MFC로 코딩하면 메모리 사용량이 1메가도 안나오는 실행파일임에도 불구하고
처음 실행하자마자 70메가를 사용하는 것으로 나오는 이 이상한 현상은 무엇일까?
아무리 닷넷 플랫품을 사용한다고 해도 말이다.
 
더 신기한 것은 이 70메가를 사용하는 프로그램을 최소화하면 2메가로 줄어든다는 것이다. 물론 다시 1~20메가로 올라간다.
 
이 역활을 하는 코드는 다음과 같다.
 
Process curProc = Process.GetCurrentProcess();
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 조명근