AIX malloc - free 시 혹은 new - delete 시의 메모리 반환
출처 : http://kldp.org/node/92461
-------------------------------------------------------------------
질문 :
안녕하세요 코딩하다가 삽질하다가 의문의 생겨 질문 올립니다.
동적 메모리 할당에서요
malloc / new 를 하고서
free / delete를 했는데 프로세스가 OS로 메모리 반환을 하지 않네요...
pa aux | grep "프로세스명" 해서 메모리 체크를 하는데요...
뭣땜에 그런건지.. 힌트라도 부탁드려요
뭘 놓지고 있는건지 ㅠㅠ
버전은 AIX 5.2이고 컴파일러는 xlC_r 입니다;
-------------------------------------------------------------------
답변 :
퍼온 글입니다. 참고하시길..
AIX 에서 malloc, free 사용시 프로세스의 메모리 사용을 모니터링하면 free 시 메모리가
커널에 원하는 만큼 반환되지 않는 것을 알 수 있습니다. 이는 커널에서 메모리 사용효율을
극대화 하기 위해 AIX 가 사용하는 내부 아키텍쳐에 기반한 지극히 정상적인 현상입니다.
따라서 메모리 할당/해제 관련 malloc, free 사용시 메모리의 효율적 사용을 고려한 AIX 의
기본처리 방식을 무시하고 함수이름 그대로 메모리를 할당/해제 하고자 한다면 해당
프로그램에서 메모리 free 시 disclaim 함수를 free 에 앞서 추가로 호출하거나 AIX 5.2 의
경우 프로그램 시작 전에 다음의 환경변수를 set 하면 됩니다.
MALLOCDISCLAIM=true
------------------------ AIX 에서의 메모리관리 기본방식 ----------------------------
When you free memory it does not go back to the system in case you need to use the
same amount of memory again.
we will use disclaim() instead of free which really returns the memory or associated
paging space to the system.
It is not sufficient to use the free() subroutine to free the space that was allocated with
the malloc() or calloc() subroutines. The free() subroutine releases only the address
range that the structure occupied. To release the real memory and paging space, use
the disclaim() subroutine to disclaim the space as well.The call to disclaim() should
be before the call to free().
-------------------------------------------------------------------
결론 :
ps aux 를 사용해서 메모리 사용량을 체크했을때 RSS 를 보면 늘어나기만 했지 줄어들지는 않는다.
이게 왜 이럴까 이러다가 난리 나는거 아닌가 싶었는데... 알아보니
위의 이유 때문이었다!! 결론적으로 프로그램이 처음에 구동 되었을때 RSS가 급격하게 증가하더라도 결국에는 어느 한 지점에
멈춰야 하는다는 것이다. 즉 메모리 사용량 최고치를 써놓으면 그게 더이상 늘지 않아야 한다는것.
즉 RSS는 윈도우 작업관리자의 최고 메모리 사용량과 일맥상통하는 개념같다...