malloc()で単純にLinuxの仮想メモリ空間のメモリ確保をし続けるプログラムのサンプルです。
出力値は、繰り返し処理が行われるたびにmallocで確保するメモリと同値(1GB)を加算していくという簡易な計算処理の結果です。
実行環境
OS
CentOS 6.4 x86_64(64bit版)
% cat /etc/redhat-release
CentOS release 6.4 (Final)
カーネルバージョン
% uname -r
2.6.32-358.11.1.el6.x86_64
メモリ
物理メモリ2G、スワップサイズ2Gです。
% free
total used free shared buffers cached
Mem: 1922564 92680 1829884 0 7156 26016
-/+ buffers/cache: 59508 1863056
Swap: 2097144 11176 2085968
カーネルパラーメータ(※2013/7/4 追記)
コメントをいただきましたので追記します。
CentOS6のデフォルトでメモリオーバーコミットがされる設定となっています。
メモリオーバーコミットについての詳細説明は省略しますが、メモリが要求された際に、搭載されている物理メモリ以上のメモリ(仮想メモリ空間)を割り当てるというOSの機能です。
# sysctl -a | grep vm.over
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
サンプルコード
get_vmem_test.c
#include <stdio.h>
#include <stdlib.h>
int main() {
char *p;
unsigned long i = 0;
// 文字列変数に1GB(1073741824 B)のメモリを確保し続ける
// メモリを確保できなくなるとmallocはnullを返すため、nullが返されるまで繰り返す
do {
p = (char *)malloc(1073741824);
i=i+1073741824;
} while (p != NULL);
// iの値が確保できたメモリの総量となる(GB単位で出力)
printf("%lu GB \n", i/1024/1024/1024);
exit(0);
}
コンパイル
% gcc -o get_vmem_test get_vmem_test.c
実行
% ./get_vmem_test
122216 GB
補足(※2013/7/4追記)
参考にオーバーコミットを無効(vm.overcommit_memory=2)、割り当て可能なメモリを物理メモリ+スワップの合計値の99%(vm.overcommit_ratio=99)に指定した場合の実行結果を記載しておきます。この環境では最大4GB割り当て可能となります。
各パラメータの詳細については下記を参照してください。
カーネルパラメータ設定変更
# sysctl -w vm.overcommit_ratio=99 && sysctl -w vm.overcommit_memory=2
パラメータ確認
# sysctl -a | grep vm.over
vm.overcommit_ratio = 99
vm.overcommit_memory = 2
プログラム実行
% ./get_vmem_test
4 GB