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だと何のシステムコールをしようとしてたかも標準(エラー?)出力に出るんすね。