免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9106 | 回复: 10
打印 上一主题 下一主题

[C] 继续内存问题!linux内存回收机制。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-22 16:44 |只看该作者 |倒序浏览
20可用积分
本帖最后由 cskyrain 于 2013-02-22 16:45 编辑

前提:一段程序使用完内存之后释放,此时linux系统不一定立即回收该内存。(有很多文章提到该机制),如果你认为这个是正确,请看下面的问题,如果你认为不是这样的,请给出解释(后面的问题也就不要看了)。

问题:先假设pid为333的进程,进行了内存分配和释放的工作,且系统没有立即回收该内存,则该段内存“属于”那个区域(例如:free命令下,是算在used,buffer,cache,free还是XX?)

同时通过top命令我们也可以看到具体进程占用内存的情况,(如virt,res段),如果我们一直监测pid 333的top输出,在上面提到的内存释放情况中,virt res是否会有相应的变化。


论坛徽章:
0
2 [报告]
发表于 2013-02-23 00:04 |只看该作者
内存分配,你指的是哪种
1)C库的malloc brk
2)系统调用mmap分配匿名内存
3)对/dev/mem的直接mmap

如果是第1种,那释放后可能暂时归还到C库的动态内存池里,不会还给内核,这部分内存计入used
如果是第2种,unmap释放后还给内核的free字段
第3种同第2种
其他的情况还没想

论坛徽章:
0
3 [报告]
发表于 2013-02-23 18:11 |只看该作者
主要只的是第一种。

如果是这样的话,那这些内存什么时候会被系统回收,大概的机制是什么样的?这种延迟释放是否会造成其他程序内存申请失败,以及oom等(看到过一篇帖子,貌似出现了种问题,内存无泄漏,但没被回收,被oom了),更重要的时,在调试内存泄漏时,如何排除这种延迟释放的干扰。回复 2# chenyu105


   

论坛徽章:
0
4 [报告]
发表于 2013-02-23 20:08 |只看该作者
cskyrain 发表于 2013-02-23 18:11
主要只的是第一种。

如果是这样的话,那这些内存什么时候会被系统回收,大概的机制是什么样的?这种延迟 ...


我看过python的内存回收机制,python是有一个界限,比如你申请一个大于256字节的内存,python会直接调用malloc,如果小于256,则是调用python自己的内存管理,python的malloc原理类似于内存池,malloc估计也是,而且python在发现内存池内存不够后会继续申请空间,但是却不会释放这些内存空间,所以python有内存泄露的问题,我也估计如果频繁申请小块内存,free的时候估计不会归还

论坛徽章:
0
5 [报告]
发表于 2013-02-25 15:26 |只看该作者
泄露应该是没有的,要不早活不下去了, 只是回收机制采用了某些处理回复 4# linyilong3


   

论坛徽章:
0
6 [报告]
发表于 2013-02-26 15:32 |只看该作者
顶下,感慨下cu的人气越来越差了

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
7 [报告]
发表于 2013-02-26 20:52 |只看该作者
我的印象中,Linux只是将内存标记为可用,而并非删除PCB

论坛徽章:
0
8 [报告]
发表于 2013-03-01 19:39 |只看该作者
顶下。~~~~~~~~~~~~~~~~~~~···

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
9 [报告]
发表于 2013-03-02 10:36 |只看该作者
C库自己管理的动态内存池(即通过malloc和free走的),会保留一定数量的页内存备用。如果malloc时备用内存不足,会继续向系统以页为单位申请内存(通常是一次性申请较大的内存),然后如果这些内存被free(此页已无人使用),会立即向系统归还。
不过具体的实现,不同的libc可能有些许差别,但大致的思路是一致的,总是保留一定数量内存,提升分配少量内存的速度。这些被保留的内存就是所谓的“没有被及时归还的部分”,但是它的大小是有限的,不会导致其他进程分配不了内存这么严重。

论坛徽章:
0
10 [报告]
发表于 2013-03-02 13:02 |只看该作者
然后如果这些内存被free(此页已无人使用),会立即向系统归还。
========================================
这个和那个保留的如何区分,c库如何知道那些事保留的,那些事要立即归还的。

保留的内存是属于谁的,或者说是属于那个进程的,如何体现。

通过top等查看到的当前进程内存占用量,是否就是当前malloc后,未free的,free掉的内存一定不会显现在当前进程的统计中???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP