프로세스가 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
정보가 덤프됩니다.