免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bigluo
打印 上一主题 下一主题

linux有查看和整理内存碎片的工具吗? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2008-06-19 09:33 |只看该作者
问题问得好,关注。

论坛徽章:
0
52 [报告]
发表于 2008-06-20 21:57 |只看该作者
看了半天没看懂LZ问什么......
1、如果你代码写得跟我一样不杂地,请用valgrind (当然,听口气是不愿与我为伍了)
2、如果对OS的内存分配感觉不爽,担心OS的智商不及您理想的程度,recode it please (听口气是做嵌入,想必系统 程序员不可能连这个都做不到,否则也不可能考虑这么高深的问题)
3、如果对库有以上类似想法,请参照2
4、如果觉得OS或库对代码的内存管理都缺乏完美,我想您需要的是一个为自己量身定做的GC
5、如果拿到了自己看不惯的代码,又在具有以上4点能力的同时缺乏时间和精力,请考虑炒您BOSS鱿鱼
6、如果连问题叙述都不清楚,还怀疑别人的理解能力,请辞职......

论坛徽章:
0
53 [报告]
发表于 2008-08-03 18:15 |只看该作者

回复 #3 cugb_cat 的帖子

知道内存碎片是怎么产生的么?
如果操作系统能自动整合内存碎片自然是好事,否则要么在程序中有优化,以减少内存碎片,要么就是有另外的兄弟帮忙了。

论坛徽章:
0
54 [报告]
发表于 2008-10-22 09:36 |只看该作者
偶也很感兴趣,觉得用户空间的碎片可以解决,但内核空间的碎片有点棘手

论坛徽章:
0
55 [报告]
发表于 2008-11-11 17:06 |只看该作者
现在给你支招可能已经太晚了。但还是说偶的思路
分析问题,楼主要解决内存碎片问题。而且是现有的程序,会产生碎片。
至于内存碎片整理工具是没有的,也是不可能有的,windows下所谓的内存碎片工具也都是忽悠人的。那些工具只是把缓冲区给释放掉,结果看起来空闲内存变大,结果系统速度反而更慢了。

碎片就是,一个50k的内存,你先吃20k,然后再吃5k,然后释放掉先前吃的那20k,剩下的内存布局就是 {20k 空闲}{5k 占用}{25k 空闲},这样虽然总计有45k空闲,但是malloc(30)都会得不到,因为没有连续的30k空闲内存。
但无论是什么内存碎片整理工具都是无法将那5K往前挪动。
理由是
如果你程序用一个 void *p 指针指向那5K的内存地址,假如用外部的整理工具挪动那5K内存,就需要改动void *p的指向,然而外部的整理工具是无法知道你程序中有哪些指针,或者指针偏移是指向那块内存。

还有一种碎片叫"内碎片"{20k 空闲}{25k 空闲},这种内碎片,这种碎片不必去理会,那是相对于操作系统管理上的碎片,这种碎片对于系统内核是碎片,但对于程序来说不是碎片,程序可以正常使用这样的内存。

回来分析楼主的问题,解决办法是加载一个内存池,如果程序已经成型,不能往原程序里面加内存池,那还有一个办法
glibc有一个机制,用环境变量LD_PRELOAD可以替换掉一个lib。
堆碎片是由于malloc 和 free函数产生。你就弄一个带内存池的malloc和free,然后LD_PRELOAD替换掉glibc的malloc和free
这样只是把程序封闭起来,防止别的程序对他的碎片干扰。如果程序自身会产生碎片,这方法就无效了。
你还想处理掉自身碎片,那就用CPU陷阱技术...........(偶只是听说过有这个技术,特定条件产生中断)

[ 本帖最后由 izayoi 于 2008-11-11 17:13 编辑 ]

评分

参与人数 1可用积分 -10 收起 理由
net_robber -10 恶意灌水 http://bbs.chinaunix.net/ ...

查看全部评分

论坛徽章:
0
56 [报告]
发表于 2008-11-11 23:38 |只看该作者
内存空洞的问题现在经常出现啊。处理大量数据的时候出现这些问题很正常。实在不行就修改设计重新编码吧。其实也挺快的。我维护一个烂系统一段时间之后终于受不了,把它推倒重来了。

论坛徽章:
0
57 [报告]
发表于 2008-11-12 00:00 |只看该作者
最近也对这问题感兴趣,正考虑能不能不用内存池来解决,比如用多进程来处理数据
要处理复杂数据的地方先fork,在子进程里处理,然后通过shm等方式把结果传回来,然后子进程退出,退出时产生的碎片一并清除...这样来看,多进程方式的程序要优于多线程,能够轻松地把内存碎片阿,崩溃阿,推给子进程

论坛徽章:
0
58 [报告]
发表于 2010-07-08 13:53 |只看该作者
我之前做过Windows跟Linux内存性能的测试.
           malloc(1M+random(1~1M));
之后再free掉.

上面的操作循环10万次,记下时间就知道了.Linux在几十毫秒就能完成.Windows十几分钟都没完成.
自己去做测试.

我不懂原理,只知道测试结果Windows性能太差.
Windows下碎片问题很严重.程序跑了2天,里面malloc,free用的比较多.每次都malloc 200k左右,在第2天的时候内存分配不出来了.肯定是内存碎片造成的.因为物理内存用了400多M, 物理内存用了500M左右.电脑的内存是4G的.跑在Windows2003下面.自己做测试.同样的程序在Linux(CentOS或RedHat5)上面跑了近2周都没出现这种问题.两台机器配置基本一样.

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
59 [报告]
发表于 2010-07-08 14:32 |只看该作者
问题无非就是合并多个小的可用内存变成一个大的可用内存区域呗。
估计是要从页面文件到物理地址的映射这个环节着手吧。
找起来相对容易,可以从操作系统入手,但是怎么合并啊:
比如p0 = p1 +100,但是物理地址上二者却是 p0=p1+1;

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
60 [报告]
发表于 2010-07-08 15:59 |只看该作者
不要以为linux有多么先进,基本所有的操作系统都会存在内部碎片和外部碎片。就linux而言,内部碎片是ke ...
bigluo 发表于 2008-06-10 14:29


不要以为WINDOWS就是老大了,LINUX的内存管理策略要比WIN高明得多,不会碎片的。
对每个进程都是大块的提供内存,进程中malloc只在块中分配,不够了可以再要一大块。进程结束时,整块归还。
因此即使进程里有内存泄漏,结束时也都释放了。不会发生WIN那样的系统级内存泄漏和系统级内存碎块。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP