문제

저혈압 프로그램과 유사한 내 응용 프로그램 :

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

메모리 누출이 없지만 내 시스템에서 메모리 소비 (상단, 열 VS)는 제한없이 증가합니다 (예 : 사용 가능한 물리적 메모리의 300%). 이것은 정상입니까?

업데이트되었습니다 - 메모리를 잠시 동안 사용한 다음 해방하십시오. 이것이 차이인가요?

도움이 되었습니까?

해결책

추가하십시오

  sbrk(-1);

각 루프가 끝나면 차이가 있는지 확인합니다.

Free ()는 메모리 만 거래하지만 OS로 돌려주지는 않습니다.

다른 팁

행동은 정상입니다. 인용 man 3 malloc:

버그

기본적으로 Linux는 낙관적 인 메모리 할당 전략을 따릅니다. 이것은 malloc ()가 널을 반환 할 때 메모리를 실제로 사용할 수 있다는 것을 보장 할 수 없음을 의미합니다. 이것은 정말 나쁜 버그입니다. 시스템이 기억이 나지 않는 경우 악명 높은 OOM 킬러에 의해 하나 이상의 프로세스가 죽을 것입니다. Linux가 무작위로 선택된 프로세스를 갑자기 잃는 것이 바람직하지 않은 상황에서 사용되는 경우, 커널 버전이 충분히 최근에 충분히 최근에 이루어지면 다음과 같은 명령을 사용 하여이 오버 커뮤지트 동작을 끄는 것입니다.

       # echo 2 > /proc/sys/vm/overcommit_memory

커널 문서 디렉토리, 파일 VM/Overcommit-Accounting 및 Sysctl/Vm.txt도 참조하십시오.

Linux 커널을 위해 메모리를 만질 수 있도록 메모리를 터치 (읽기/쓰기)해야합니다.

OS는 일반적으로 모든 페이지를 "0"페이지의 복사본 클론으로 할당하는데, 이는 0으로 채워진 고정 페이지입니다. 페이지에서 읽는 것은 예상대로 0이 반환됩니다. 읽은 한 모든 참조는 동일한 물리적 기억으로 간다. 값을 쓰면 "소"가 부러지고 실제, 물리적 인 페이지 프레임이 당신에게 할당됩니다. 즉, 메모리에 쓰지 않는 한 가상 메모리 주소 공간이 소진되거나 페이지 테이블이 사용 가능한 모든 메모리를 채울 때까지 메모리를 할당 할 수 있습니다.

할당 된 청크를 만지지 않는 한 시스템은 실제로 귀하를 위해 할당하지 않습니다.
그러나 OS가 프로세스에 부과하는 한계 인 주소 공간이 부족할 수 있으며 시스템 포인터 유형으로 해결할 수있는 최대 값은 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top