Linux의 프로세스에서 malloc()을 사용하여 얼마나 많은 메모리를 예약했는지 확인하세요.

Linux의 프로세스에서 malloc()을 사용하여 얼마나 많은 메모리를 예약했는지 확인하세요.

프로세스가 malloc()이 메모리에 실제로 쓰지 않으면 Linux는 이 메모리가 비어 있고 다른 프로세스에서 사용할 수 있다고 간주합니다(오버커밋).

malloc()어쨌든 특정 프로세스에서 얼마나 많은 메모리가 사용되었는지 알 수 있는 방법이 있나요 ? (사용하지 않더라도)

이 정보는 의 시스템 전반에 걸쳐 존재 /proc/meminfo하지만 특정 프로세스에 대해 알고 싶습니다.

자세히 살펴봤지만 /proc/<PID>/{smaps,stat,statm}이 정보가 표시되는지 확실하지 않습니다.

답변1

malloc()데이터 세그먼트 크기를 변경하는 호출 (, 이전에 할당된 메모리를 재사용하지 않습니다. 따라서 sbrk()또는 )에 대한 호출을 초래하는 할당은 및 mmap()에 표시됩니다 ./proc/$PID/statm/proc/$PID/stat

에서 statm첫 번째 필드는 전체 프로그램 크기를 표시하고 여섯 번째 필드는 데이터 페이지 수를 표시합니다. 둘 다 메모리 할당을 반영합니다(사용되지 않은 경우에도).

에서 stat살펴볼 필드는 vsize(현재 23번째 필드) 입니다.

(아래 표 1-3 및 1-4 참조)proc선적 서류 비치.)

malloc()이는 총 메모리 사용량과 총 데이터 세그먼트 크기를 표시하므로 편집된 메모리와 다른 메모리 사용량을 구별할 수 없습니다 .

다음 프로그램을 사용하면 이 내용을 실제로 볼 수 있습니다.

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

int main(int argc, char **argv) {
  void *buf;
  puts("Waiting before allocating...");
  sleep(20);
  buf = malloc(10*1024*1024*1024L);
  puts("Sleeping after allocating...");
  sleep(20);
  free(buf);
  return 0;
}

(언제나 오류 처리가 훌륭합니다.) 그런 다음

$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464

앤드류 헨레 지적했다 malloc_info(3), 실제로 거의 모든 프로세스에서 사용할 수 있습니다. 위의 예제 프로그램을 사용하면,디버깅 정보 없이(그냥 필요하지 않다는 것을 보여주기 위해):

$ gdb ./356532
> break free

free(이것은 프로그램의 호출에 중단점을 설정합니다 . 실제로는 에 대한 모든 호출 free이지만 "우리의 호출"을 먼저 누르게 됩니다. malloc시작 코드에서 를 사용하기 때문에 를 사용하는 것은 유용하지 않습니다 malloc.)

> run

gdb중단점에 도달 하면 malloc_info다음과 같이 호출할 수 있습니다.

> call malloc_info(0, stdout)

그러면 malloc정보가 덤프됩니다.

관련 정보