在/ proc / PID /图失踪[堆]节 [英] missing [heap] section in /proc/pid/maps
问题描述
我用一个简单的C程序,保持内存分配实验
为(i = 0; I< 10000;我++)
{
数组[我] =的malloc(1024 * 1024);
如果(阵列[我] == NULL)
{
打破;
}
的printf(沉睡...%d个\\ N,I);
睡眠(60);
}
全部code粘贴在这里: http://tny.cz/2d9cb3df
然而,当我执行cat / proc / PID /图
,我没有得到任何 [堆]
部分。为什么呢?
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-RW b75c8000-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-RW b7778000-P 001af000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7778000-RW b777b000-P 00000000 00:00 0
b7797000-RW b779a000-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-RW b77bd000-P 00020000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
bff21000-RW bff42000-P 00000000 00:00 0 [堆栈]
既然你谈论 / proc /进程/图
我假设你在Linux上。
这是什么男人的malloc
告诉我Linux发行版我正好运行:
通常情况下,
的malloc()
从堆中分配内存,并调整为所需,使用堆的大小SBRK(2)
。
当分配的内存比
MMAP_THRESHOLD
字节的块,glibc的的malloc()
实施分配内存作为使用的mmap(2)私人匿名映射
。MMAP_THRESHOLD
为128 KB的默认,但可调节使用mallopt(3)
。
分配使用
的mmap(2)
是由RLIMIT_DATA
资源限制不受影响(见<$ C $下进行>使用getrlimit(2))。
块引用>如果你真的想看到
[堆]
在/ proc /进程/图
分配小于128K每次调用MALLOC。I'm experimenting with a simple C program that keeps allocating memory:
for ( i = 0; i < 10000; i ++ ) { array[i] = malloc( 1024*1024 ); if ( array[i] == NULL ) { break; } printf("Sleeping...%d\n", i); sleep( 60 ); }
Full code pasted here: http://tny.cz/2d9cb3df
However, when I
cat /proc/pid/maps
, I get no[heap]
section. Why?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]
解决方案Since you're talking about
/proc/pid/maps
I assume you're on linux.This is what
man malloc
tells me on the linux distribution I happen to run:Normally,
malloc()
allocates memory from the heap, and adjusts the size of the heap as required, usingsbrk(2)
.When allocating blocks of memory larger than
MMAP_THRESHOLD
bytes, the glibcmalloc()
implementation allocates the memory as a private anonymous mapping usingmmap(2)
.MMAP_THRESHOLD
is 128 kB by default, but is adjustable usingmallopt(3)
.Allocations performed using
mmap(2)
are unaffected by theRLIMIT_DATA
resource limit (seegetrlimit(2)
).If you really want to see
[heap]
in your/proc/pid/maps
allocate less than 128k per call to malloc.这篇关于在/ proc / PID /图失踪[堆]节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!