1プロセスでmallocできる限界を調べてみる

32bit OSだと、1プロセスでmallocできる限界ってどのくらいなんだろうと思って、調べてみた。
こんな感じで、メガバイト単位でmallocをして、失敗したら「失敗」て出力して、成功したら即freeするプログラムを作ってみた。

$ cat mallocTest.c 
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
  int input;
  input = atoi(argv[1]);
  char *buf = NULL;
  buf = (char *)malloc(input * 1024 * 1024);
  if(buf == NULL){
    printf("メモリ確保に失敗しました\n");
    return -1;
  }
  sprintf(buf, "正常終了\n");
  printf("%s", buf);
  free(buf);
  return 0;
}

動かしてみる。

$ gcc mallocTest.c
$ ./a.out 1748
メモリ確保に失敗しました
$ ./a.out 1747
正常終了

1747MBまではmallocできた。CentOS5.7(x86)PAEで確認。物理メモリは4GBで、OS起動直後の3.4GBくらい空きがある状態で確認。

http://www.syuhitu.org/other/memory32/memory32.html
↑ここのページ見ると、Windowsだと1657MBが限界みたいなので、CentOSのほうがじゃっかん余裕があるってことなのかな?


(追記)64bit OSでもやってみた

ちょっと気になったので、Mac OS 10.5.8でもやってみた。物理メモリは2GB。

$ ./a.out 2301
a.out(15817) malloc: *** mmap(size=2412773376) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
メモリ確保に失敗しました
$ ./a.out 2300
正常終了

2300MBまでmallocできた。やっぱ32bit OSと比べるとかなり増える。Macだと何のシステムコールをしようとしてたかも標準(エラー?)出力に出るんすね。