我正在尝试一个不断分配内存的简单C程序:
for ( i = 0; i < 10000; i ++ )
{
array[i] = malloc( 1024*1024 );
if ( array[i] == NULL )
{
break;
}
printf("Sleeping...%d\n", i);
sleep( 60 );
}
Run Code Online (Sandbox Code Playgroud)
完整代码粘贴在这里:http://tny.cz/2d9cb3df
但是,当我cat /proc/pid/maps
,我没有任何[heap]
部分.为什么?
08048000-08049000 r-xp 00000000 08:11 17 /data/a.out
08049000-0804a000 r--p 00000000 08:11 17 /data/a.out
0804a000-0804b000 rw-p 00001000 08:11 17 /data/a.out
0804b000-0805e000 rw-p 00000000 00:00 0
b74c6000-b75c8000 rw-p 00000000 00:00 0
b75c8000-b7775000 r-xp 00000000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7775000-b7777000 r--p 001ad000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7777000-b7778000 rw-p 001af000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7778000-b777b000 rw-p 00000000 00:00 0
b7797000-b779a000 rw-p 00000000 00:00 0
b779a000-b779b000 r-xp 00000000 00:00 0 [vdso]
b779b000-b77bb000 r-xp 00000000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
b77bb000-b77bc000 r--p 0001f000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
b77bc000-b77bd000 rw-p 00020000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
bff21000-bff42000 rw-p 00000000 00:00 0 [stack]
Run Code Online (Sandbox Code Playgroud)
既然你在谈论/proc/pid/maps
我假设你在Linux上.
这就是man malloc
我碰巧运行的linux发行版的原因:
通常,
malloc()
从堆中分配内存,并根据需要使用调整堆的大小sbrk(2)
.当分配大于
MMAP_THRESHOLD
字节的内存块时,glibcmalloc()
实现将内存分配为私有匿名映射使用mmap(2)
.MMAP_THRESHOLD
默认为128 kB,但可以使用调整mallopt(3)
.使用的分配
mmap(2)
不受RLIMIT_DATA
资源限制的影响(请参阅参考资料getrlimit(2)
).
如果你真的想[heap]
在/proc/pid/maps
每次调用malloc时分配不到128k.