M_TRIM_THRESHOLD:当可以被释放的内存堆积到该值时进行正真的释放(sbrk)操作;
M_MMAP_THRESHOLD:如果需要分配的内存超过该值,glibc将采用mmap分配内存。
这 样的话,超过M_MMAP_THRESHOLD的内存分配都将采用mmap进行,如此的结果就是当用户调用free的时候,它将马上返还给操作系统,这些 内存就不会占据着可能根本就不会再使用的比如heap空间,那样地话可能还会导致heap过于大从而阻碍正常的别的mmap分配。通过这种分级分配机制, 用户只要设置好自己的策略,内存分配在底层看来就会和谐很多,不会过于严重的出现内存块大小相间的情况,也不会出现小内存乱释放导致碎片,最大的可用内存 无法满足大内存需求但是空闲内存之和却很大的情况。其实heap在linux中是个很松散的概念,之所以有heap这一说是历史原因,其初衷是为了管理动 态内存,那是在指针这种数据类型被展示给程序员之后的事了,然而如果我们有更好的内存管理方式特别是动态内存管理方式的话,那么为何还要死死拽住heap 这个概念呢?其实就算是内核也是一切为了用户,最初的内存和进程同时换入换出,然后又有了写时复制,就是说在fork子进程的时候,完全和父进程共享内存 区域,然后直到二者之一有写操作的时候才将写的页面分离,其实这个写时复制机制只不过是动态请页机制的一个策略,另一个策略就是物理内存并不映射到进程地 址空间,直到第一次访问的时候再做,而且每次只映射一个页面,和谐的是,这二者同时在缺页处理中实现,其实这种懒惰的方式是有道理的,其根本就是为了向每 个进程可以最大化的使用内存,想达到这个目的每个进程就必须做相反的事,也就是用最懒惰的方式使用内存,向最小化使用内存的方向收敛,这看似是矛盾的,然 而这就是自组织,我们保护环境是为了利用环境,比如可以让更多的人开上车(如果环境被破坏就没有办法再开车了),使生活更舒适,然后为了达到这个目标就必 须尽量少开车,这就是和谐。需要节省资源的需要采用懒惰机制的是个体,最大化收益的是整体,带来的结果就是公平,就是和谐。
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273407