在/ proc / PID /图失踪[堆]节 [英] missing [heap] section in /proc/pid/maps

查看:203
本文介绍了在/ proc / PID /图失踪[堆]节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用一个简单的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, using sbrk(2).

When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3).

Allocations performed using mmap(2) are unaffected by the RLIMIT_DATA resource limit (see getrlimit(2)).

If you really want to see [heap] in your /proc/pid/maps allocate less than 128k per call to malloc.

这篇关于在/ proc / PID /图失踪[堆]节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆