在上一篇文章中,小编为您详细介绍了关于《如何评价 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元手机》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器