为什么会产生内存碎片?( 二 )


8、进程调用free(D)以后,如第二幅图所示:B和D连接起来,变成一块140K的空闲内存 。
9、默认情况下:当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim) 。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成第三幅图所示 。
如果这个时候我们想要申请一块50K的内存E,就会出现下图的情况 。
 

为什么会产生内存碎片?

文章插图
 
有没有发现,并没有从中间40K的内存分配,因为不满足我们申请50K大小的要求,而是向下偏移指针_edata分配50K,到这里就能发现就产生了内存碎片,这块碎片正是那40K 。
系统运行的越久,出现上述这样的情况越多,整个系统的小内存就会很多,导致的结果是:查看系统的剩余内存比较可观,但申请大块内存会返回失败 。

【为什么会产生内存碎片?】


推荐阅读