그래서 C에서는 메모리 누수가 발생하기 쉽다는 것을 배웠습니다.
#include <stdio.h>
void main() {
int* p;
int i=0;
p=(int*)malloc(sizeof(int));
while (p!=NULL) {
p=(int*)malloc(sizeof(int));
i++;
}
printf("malloc failed after %d allocations\n",i);
}
이 프로그램을 시작할 때마다 컴퓨터를 다시 시작하지 않거나 너무 늦기 전에 프로그램을 종료하는 방법을 알고 싶습니다.
ulimit
해결책인 것 같습니다. ulimit -S -m 1000000
이렇게 하면 프로세스가 1000000kbyte/1gbyte 이상의 메모리를 차지하는 것을 방지할 수 있습니다(RAM은 32gbyte입니다). 그러나 전혀 효과가 없는 것 같습니다. 위의 프로그램을 시작할 때 프로그램을 종료하지 않으면 모든 메모리를 사용합니다.
매우 낮은 제한(100kbyte...)을 설정하거나 -v
RSS 대신 가상 메모리 제한( )을 설정해 보았으나 아무런 효과가 없었습니다...
내가 놓친 게 무엇입니까?
답변1
ulimit -m
제한된상주 세트 크기프로세스 수 - 즉, 한 번에 호출할 수 있는 프로세스 부분 수입니다.
스왑 공간을 사용할 수 있으면 프로세스의 가상 메모리가 훨씬 더 커질 수 있습니다.
ulimit -v
할당할 수 있는 가상 메모리의 양을 제한하십시오. 이것이 바로 원하는 것입니다. 반드시 자식 프로세스에 의해 상속되는 것은 아니므로 서브쉘을 사용하고 다음을 수행하십시오 exec
.
( ulimit -v 1000000 && exec test_program )
답변2
Ram(대부분의 Unix 시스템에서)은 첫 번째 쓰기 시 지연 할당됩니다. malloc()에서 반환된 포인터에는 쓰지 않습니다.