2017-11-17 11 views
1

많은 양의 데이터 (100MB 이상)를 처리하는 C 응용 프로그램이 있습니다. malloc()을 사용하여 필요한 메모리를 할당합니다.C malloc + free 메모리 사용량 증가 계속

(char*)malloc(argLen + 18 + 2) 

실행 후 할당 된 메모리를 해제하려면 free을 사용합니다.

나는 이유가 있기 때문에 무료 메모리가 OS로 반환되지 않는다는 것을 알고 있습니다. 내 질문은 할당 된 메모리를 다시 사용하는 대신 프로그램을 다시 실행할 때 응용 프로그램의 메모리 사용량을 계속 증가시키는 것입니다.

편집 : 혼란 스럽습니다. 프로세스는 WebSocket 서비스입니다. 의도적으로 중지되지 않는 한 종료되지 않습니다. 이것은 프로세스가 메모리 사용량을 계속 증가시킬 것이고 수동으로 다시 시작하지 않으면 할당 된 메모리를 사용하지 못하게 할 것입니까?

+0

* "나는 이유가있어 자유 메모리가 OS로 반환되지 않는다는 것을 알고 있습니다."* - 왜 그렇게 생각하니? – klutt

+3

'free()'는 메모리를 즉시 os로 반환하지는 않지만, _termination_ 프로세스 이후에, 그 프로세스에 의해 사용 된 모든 메모리는 즉시 다시 이용 가능해야한다. – Ctx

+1

그 질문입니까 ("장기간 사용하면 메모리 사용량이 증가합니까?") 또는 관찰 한 내용입니까? – datenwolf

답변

3

나는 자유로운 기억이 어떤 이유로 OS에 반환되지 않는다는 것을 알고 있습니다.

free을 호출 한 후 메모리에 어떤 일이 발생하는지는 구현에 따라 다릅니다. 운영 체제에 완료되었다고 알립니다. 그것은 공개할지 여부를 결정할 수 있습니다. 이를 공개하지 않은 한 가지 이유는 메모리를 할당하는 데 많은 비용이들 수 있으며, 프로그램이 더 많은 메모리를 요구하면 OS는 동일한 메모리를 다시 돌려 줄 수 있습니다.

제 질문은 할당 된 메모리를 다시 사용하는 대신 프로그램을 다시 실행할 때 제 응용 프로그램의 메모리 사용량을 계속 증가시키는 것입니다.

아니요. 프로그램이 종료되면 할당 된 모든 메모리가 해제됩니다. 적어도 그렇게해야합니다. 그럼에도 불구하고 은 "귀하의 비즈니스가 아닙니다"라고 말할 수 있습니다..

간단한 C 프로그램을 만들었습니다. 오류 검사는 없지만 프로그램을 실행하는 동안 프로그램의 동작을 관찰하는 데 사용할 수 있습니다. 무작위 값으로 배열을 채우는 코드와이를 인쇄하기위한 코드는 아무 것도 최적화되지 않도록하기위한 것입니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int *ptr; 
    int size; 
    char c='a'; 
    srand(time(NULL)); 

    while(c!='q') 
    { 
     printf("a - allocate memory\n"); 
     printf("f - free memory\n"); 
     printf("p - print array\n"); 
     printf("q - quit\n"); 
     printf("Choose: "); 
     scanf(" %c", &c); 
     if(c=='q') 
      break; 
     else if(c=='a') { 
      printf("Size : "); 
      scanf(" %d", &size); 
      ptr=malloc(size * sizeof(*ptr)); 
      for(int i=0; i<size; i++) 
       ptr[i]=rand(); 
     } 
     else if (c=='f') 
      free(ptr); 
     else if(c=='p') { 
      for(int i=0; i<size; i++) 
       printf("%d", ptr[i]); 
     } 
    } 
} 

내가 top -p<PID>와 과정을보고 있었다 그리고이 모습을 사용하는 동안 :

PID USER  PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND  
28601 klutt  20 0 4172 692 616 S 0.0 0.0 0:00.00 a.out  

내가 할당 해제 된 메모리는 가끔 보여 때로는하지 않는 경우. 큰 크기를 지정하면 더 자주 차이가납니다. 그리고 예, 저는 Windows를 지정했고 Linux 명령을 사용했음을 알고 있습니다. 그러나 Windows에서 프로세스를 분석 할 수있는 동등한 도구를 찾을 수 있다고 확신합니다.