测试堆的最大申请数量
Linux下虚拟地址空间分给进程本身是3GB,那么程序真正能用的有多少?一般我们写程序都是通过调用malloc函数进行地址空间的申请,刚才的问题就可以转换为malloc最大能为进程分配到多少内存空间?下面这段小程序可以测试当前使用的机器上malloc能分配的最大数量:
/*
{/ . .\}
( (oo) )
+--------------oOOo---︶︶︶︶---oOOo------------------+
# FileName : max_malloc.c
# Describe : 获取本机堆的最大申请数量
# Author : Lazy.monkey™
# Email : lazymonkey.me@gmail.com
# HomePage : lazymonkey.is-programmer.com
# Version : 0.0.1
# LastChange: 2012-05-16 00:25:17
# History :
+------------------------------------Oooo--------------+
*/
#include <stdio.h>
#include <stdlib.h>
unsigned maximum = 0;
int main(int argc, const char *argv[])
{
unsigned block_size[] = {1024 * 1024, 1024, 1};
int i, count;
for (i = 0; i < 3; i++) {
for (count = 1;; count++) {
void *block = malloc (maximum + block_size[i] * count);
if (block) {
maximum = maximum + block_size[i] * count;
free (block);
} else
break;
}
}
printf("maximum malloc size = %u bytes\n", maximum);
printf("any way, i wana it show me as human size is %u MB\n",
maximum / (1024 * 1024));
return 0;
}
在我的机器上得到结果为2010MB左右,为什么一定要强调当前机器?其实malloc的最大申请数量并非是恒定的,即使是同一台机器也会有微小的变化,那么malloc的最大申请数量会受那些因素影响?实际上,操作系统版本、程序本身大小、用到的动态/共享库数量、大小、程序堆栈数量、大小都会使malloc最大申请数量有所变化,甚至有可能每次运行的结果都会有所不同,据说Linux采用了一种叫做随机地址空间分配的技术(主要是处于安全考虑,防止程序恶意攻击),使得进程的堆的空间变小。
评论 (0)