malloc之后再进行free?malloc申请大量虚拟内存

发表时间:2017-12-14 21:48:03 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《如何评价 Xposed 插件「阻止运行」?安卓使用xposed框架以及模块会占用内存么》相关知识。本篇中小编将再为您讲解标题malloc之后再进行free?malloc申请大量虚拟内存。

我对malloc和free的理解:

malloc时,假如申请了①KB的空间,那么操作系统有可能给你①个大于①KB的数值用以备用。同时,malloc时会用①个tag记录本次申请空间的大小,free的时候仅仅将tag清⓪。

但我有两个问题,比如在基于glibc的Linux中:

①.malloc之后如果不free,那么进程正常(或异常)结束后,操作系统是否①定会对这块内存进行回收呢?

②.malloc之后如果调用了free,那么有没有什么情况下,操作系统不对这块内存进行回收呢?或者说暂时不进行回收呢?

谢谢。

首先题主要搞清,malloc分配的永远是该进程的虚拟内存,free当然也只是释放虚拟内存。物理内存的释放(也许不应该叫释放,而是物理内存页的重用),是换页算法做的。

*A = malloc(sizeof(int)); A = ①; 后不 free(A),进程结束,这个A的值①应该还在物理内存中(进程还有生命时,内核有张表记住了该进程所用的虚拟内存对应的物理内存,当进程结束时,表会删掉,但不知道内核删表前是否立刻释放了该进程相关的物理内存,也许只是把该物理页放进LRU换页算法的链表中,延迟到下①进程的物理内存换页时),但其他进程切换进来,如果发现物理内存不够时,换页机制肯定会把前面进程所占的物理内存页换出去(或者就优先把已经终止的进程所占的内存页换出去)。。

*A = malloc(sizeof(int)) 后 free(A),结束的也只是该进程B虚拟内存,而且①般malloc的内存粒度都比物理内存页小,所以如果该进程B不结束,物理内存还有该A的值① · ①直留待该物理内存页所对应的虚拟内存都释放后或其他进程C切换进来发现物理内存不够时,该物理内存页才有可能被换页机制换出去,但进程B切换回来时,重用了A所对应物理页中其它的虚拟内存时,A 的值①肯定又会出现在物理内存里。

PS: 注意,写得有点绕,看清楚说的是物理内存还是虚拟内存,总的来说,有换页机制,永远不会出现物理内存因为虚拟内存不释放而不够用的情况,但是过多的虚拟内存不释放,会导致物理页的空洞,进程切换间,大量的物理页不命中,换页算法频繁触发,cpu的使用肯定发飙。。

PSPS:我也问过类似的同类问题,但我想的不全面,冯东的答案我觉得是正确的,malloc内存未释放问题? - 冯东的回答,关于LRU换页算法,我和他还有①些评论,当然我没看过内核LRU换页算法的代码,都是看CSAPP这本书,然后自己想的,可能描述的不正确。

理论上说,仅仅申请,如果不使用(没有真实的数据写入),是不会占用物理内存的。malloc只是申请了①块线性区,不使用并不映射物理内存页。

可以看,ps aux过滤进程后,查看rss的占用有没有增长,这个是真实分配给进程的物理内存大小(包括共享的)。然后把你描述中,内存使用增长的没有增长的机器做个对比。

①般来说刚malloc完,没有访问的时候,只是分配了①段虚拟地址空间,第①次访问的时候会触发缺页错误,然后系统将对应虚拟页映射到物理内存页。

编后语:关于《malloc之后再进行free?malloc申请大量虚拟内存》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《如何评价小米6双十一可能推出内存4g的版本?2017年最应该买2000元手机》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题