C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47281] TMemoryStatus 메모리값 체크
MHyoo [] 1376 읽음    2006-12-01 22:28
메모리가 지속적으로 올라가는 현상때문에
어느 부분에서 메모리가 올라가는지 확인하기위해
TMemoryStatus를 이용하여 메모리값을 체크해보았습니다.


함수를 호출하기 전/후에 메모리값을 체크해보았는데
총메모리값(dwTotalPhys)은 변하지 않으나
사용 메모리값은 오르락 내리락 하는 현상을 보입니다.
하물며, 단순히 함수를 호출하기 전 후에도  메모리가 증가하는 현상이 나타납니다.
예를 들어
A()
{
   unsigned long used=0;
   memfo.dwLength = sizeof(memfo);
   GlobalMemoryStatus(&memfo);
   g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
   used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
   g_WLog->Write("사용 메모리크기 = (%d) \n", used);          //<-----------------함수 호출전

   B(); 
}

B()
{
   unsigned long used=0;
   memfo.dwLength = sizeof(memfo);
   GlobalMemoryStatus(&memfo);
   g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
   used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
   g_WLog->Write("사용 메모리크기 = (%d) \n", used);          //<-----------------단순 호출(처리부 이전)
  
   RETURN;
}

함수 호출전과 단순 호출(처리부 이전)과 사용 메모리 크기가 차이가 납니다. 증가!!!!!
제 생각에는 아무 변화가 없어야 할것 같은데 말입니다.

또하나 이상한 점은
프로그램 내에서 체크한 메모리는 들쭉날쭉 하긴 해도 지속적으로 증가하는 추세는 아닙니다만
시스템관리자에서 볼수 있는 메모리값을 체크해보면 지속적으로
메모리가 상승합니다....이런...--;;

체크를 해봐야 하는 메모리값이 총메모리값이 아니고
사용메모리 값인가요????

이와 같은 방법으로 메모리 체크를 하는 것이 맞는지 궁금합니다.

참고로 사용메모리값은 총 메모리값과 availphys를 가지고 제가 산출한 값입니다.


아래는 생성자와 소멸자에서만 일단 메모리를 체크한 부분입니다.

__fastcall TCTRMsgMaker::TCTRMsgMaker(TComponent *Owner)
{
memfo.dwLength = sizeof(memfo);
GlobalMemoryStatus(&memfo);
g_WLog->Write("*TCTRMsgMaker생성자 시작*\n");
unsigned long used=0;
g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
g_WLog->Write("사용 메모리크기 = (%d) \n", used);

    lstImage = new TList;

GlobalMemoryStatus(&memfo);
g_WLog->Write("*TList new 이후*\n");
used=0;
g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
g_WLog->Write("사용 메모리크기 = (%d) \n", used);
}

__fastcall TCTRMsgMaker::~TCTRMsgMaker()
{

for (int i = 0; i < lstImage->Count; i++)
    {
        Graphics::TBitmap *bitmap;
        bitmap = (Graphics::TBitmap *)lstImage->Items[i];
        free(bitmap);
    }
    if(lstImage)        delete lstImage;

GlobalMemoryStatus(&memfo);
g_WLog->Write("*TList delete 이후*\n");
used=0;
g_WLog->Write("총   메모리크기 = (%d) \n", memfo.dwTotalPhys);
used = memfo.dwTotalPhys/1024 - memfo.dwAvailPhys/1024;
g_WLog->Write("사용 메모리크기 = (%d) \n", used);
}

그 결과는  이렇습니다.

[22:03:23:562] [PID:120100] Warning정보를 기록합니다.
[22:03:23:671] *TCTRMsgMaker생성자 시작*
[22:03:23:671] 총   메모리크기 = (534822912)
[22:03:23:687] 사용 메모리크기 = (333184)
[22:03:25:000] *CFDBAccess Dup 이후*
[22:03:25:000] 총   메모리크기 = (534822912)
[22:03:25:000] 사용 메모리크기 = (332752)
[22:03:25:015] *TList new 이후*
[22:03:25:015] 총   메모리크기 = (534822912)
[22:03:25:015] 사용 메모리크기 = (332760)
[22:03:25:015] *aLcsCommInfo memset 이후*
[22:03:25:015] 총   메모리크기 = (534822912)
[22:03:25:015] 사용 메모리크기 = (332596)
[22:06:54:750] *CFDBAccess delete 이후*
[22:06:54:750] 총   메모리크기 = (534822912)
[22:06:54:750] 사용 메모리크기 = (331048)
[22:06:54:750] *TList delete 이후*
[22:06:54:781] 총   메모리크기 = (534822912)
[22:06:54:796] 사용 메모리크기 = (331076)
[22:06:54:796] [PID:120100] Warning정보 기록을 종료합니다.

총 메모리값은 일정하지만, 사용메모리값은 들쭉날쭉...

+ -

관련 글 리스트
47281 TMemoryStatus 메모리값 체크 MHyoo 1376 2006/12/01
47292     Re:메모리메니저 때문입니다. 김상구.패패루 1295 2006/12/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.