欢迎来到优知文库! | 帮助中心 分享价值,成长自我!
优知文库
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 优知文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    AIX 进程内存分配与回收策略及应用开发建议.docx

    • 资源ID:1091835       资源大小:191.27KB        全文页数:33页
    • 资源格式: DOCX        下载积分:7金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录
    二维码
    扫码关注公众号登录
    下载资源需要7金币
    邮箱/手机:
    温馨提示:
    快捷下载时,如果您不填写信息,系统将为您自动创建临时账号,适用于临时下载。
    如果您填写信息,用户名和密码都是您填写的【邮箱或者手机号】(系统自动生成),方便查询和重复下载。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    AIX 进程内存分配与回收策略及应用开发建议.docx

    目录1.AlX内存分配回收策略1.1 内存分配观察示例一递增分配1.2 内存分配观察示例一递减分配1.3 针对长逐行程序的空闲内存回收1.4 mallopt示例11.5 mallopt示例21.6 内存回收disclaim策略1.7 disclaimdisclaim64代码示例1.8 内存碎片对内存回收的影响1.9 通用建议2 .内存监控2.1 观察系统中内存占用最高的进程2.2 寻找内存持续增长的进程2.3 如何通过共享内存ID对应关联到该共享内存的进程2.4 如何获取AIXKernel的内存使用率2.5 如何判断系统是否存在内存不足3 .应用开发工具3. Idbx使用以及coredump定位3.2 内存非法使用检查3.3 内存泄漏检查(report_allocations)3.4 内存泄漏检查示例3.5 proctools介绍3.6 probevue介绍如何将C文件与汇编文件对应1.AlX内存分配回收策略一般而言,系统会直接在进程空间的free列表中维护其free释放的内存,以供后续新的分配直接使用,这样可以提高分配效率,不需要每次内存分配都经过系统内核。进程退出后,系统会回收该进程占用的全部内存。注:选择不同的分配策略时,对空闲内存空间的管理策略会有所差异。例如默认的管理结构是CarteSian树;而采用WatSon分配算法时,使用的管理结构是红黑树。Cartesian笛卡尔树参考结构:DeaeasrglengthsROOTInereaSngaddresses1.1 内存分配观察示例一递增分配进程的详细内存分配情况可以使用SVmon来观察,参考如下示例。需要注意,为方便svmon观察,示例代码需要在malloc之后调用memset进行初始化;因为操作系统实际上并不会立即对已申请但尚未访问到的内容分配实际存储空间,而是推迟到第一次访问时才会实际分配一这即是缺页机制的工作原理。如下是一个申请空间递增的应用,分配/释放大小为2MB->4MB->8MB->16MB,则通过各阶段的svmon可以看到,内存页面会持续增长,从2MB一直增力口到16MB(注意不是2MB+4MB+.+16MB=30MB)oManOC分配2MB,未初始化时:rtanzga:/#svmon-11rP909436PidCommandInusePinPgspVirtual64-bitMthrd16MB909436testm165848841727YNNVsidEsidTypeDescriptionPSizeInusePinPgspVirtual2cba711worktextdataBSSheaps2002AddrRange:0.512839b2ffffffffworkapplicationstacks2002AddrRange:65534.65535AddressRange为0512页,即代表512×4096=2MB虚拟地址空间。VirtUaI取值为2,表示该空间尚未实际分配。初始化后:2cba711worktextdataBSSheaps51300513AddrRange:0.512VimIaI取值为513,表明虚存空间已经实际分配。释放之前申请的2MB,重新申请4MB并初始化后:2cba711worktextdataBSSheaps1025001025AddrRange:0.10241024×4096=4MB,此前释放的512页虚拟地址空间被重复利用。释放之前申请的4MB,重新申请88MB并初始化后:2cba711worktextdataBSSheaps2049002049AddrRange:0.2048此前释放的1024页虚拟地址空间被重复利用。释放之前申请的8MB,重新申请16MB并初始化后:2cba711worktextdataBSSheaps4097004097AddrRange:0.40961.2 内存分配观察示例一递减分配如示例,如果是一个申请空间递减的应用,分配/释放大小为16MB->8MB->4MB->2MB,通过各阶段的svmon(svmon-nrP<pid>)可以看到,内存页面始终维持在16MBoMaIk)C分配16MB,未初始化时:VsidEsidTypeDescriptionPSizeInusePinPgspVirtualbl41411worktextdataBSSheaps2002ddrRange:0.40962cba7ffffffffworkapplicationstackAddressRange为04096页,即代表4096X4096=16MB虚拟地址空间。InuseZVirtual取值为2,表示该空间尚未实际分配。初始化后:VsidEsidTypeDescriptionPSizeInusePinPgspVirtualb!41411worktextdataBSSheaps4097004097AddrRange:0.4096Virtual=4097页,虚拟内存已经实际分配。释放之前申请的16MB,重新申请88MB并初始化后:b!41411worktextdataBSSheaps4097004097AddrRange:0.4096释放之前申请的8MB,重新申请44MB并初始化后:bl41411worktextdataBSSheaps4097004097AddrRange:0.4096释放之前申请的4MB,重新申请22MB并初始化后:bl41411worktextdataBSSheaps4097004097AddrRange:0.4096可以看到SVmOn输出结果没有变化;原因是虽然应用调用了free释放了16MB内存,但系统的处理策略是将该内存置于进程自身的空间块树中管理。下一个8MB分配,实际上是直接从进程已有的16MB空闲块中获取的。但对系统而言,进程管理的空闲块树也对应为该进程的内存消耗,所以其内存占用没有变化。测试代码:#include<stdio.h>include<stdlib.h>!include<errno.h>intmain(intargc,char*argv)(char*p;intsize=1024*4096;intindicator;if(argc"2)size=atoi(argv(l)*4096;p=(char*)malloc(size);printf("sizeofmalloc=%dMB,pressenternn,size/(1024*1024);getchar();memset(pr0rsize);getcharO;while(p!=NULL)(free(p);size=2;/如果用递增,则size*=2;p"(char*)malloc(size);memset(p,0zsize);if(p=NULL)(printf(nerrorencountered,mallocreturnNULL,error三%dn,errno);else(printf("sizeofmalloc三dMB,pressentern'size/(1024*1024);)getchar();1getchar();return0;1.3 针对长运行程序的空闲内存回收由于上面介绍的内存使用方式,一个常见的现象是,对于长运行进程,其占用的私有内存大小等同于最高峰时间的内存大小。这个现象一般而言,对系统正常运行及性能的影响很小。因为如果系统空闲内存足够,这个问题不存在。而如果内存不足,由于进程本身的空闲块列表没有被引用,根据换页算法,在系统缺页(即可用内存不足)时,很容易被换出。但如果应用进程希望对其空间内存块进行更自主的管理,可以使用mallopt接口。例如,对长运行的程序,定期在其闲时(例如每周日凌晨业务量极低时),调用mallopt(M_DISCLAIM,0)释放进程私有空间的free列表。这样可以避免在程序本身没有内存泄漏的情况下,因业务高峰期大量的内存申请造成的进程私有freelist增长,而使得进程内存占用过大。实现起来也相当简单(参考如下mallopt示例)。参考mallopt函数的帮助信息:CommandValueEffectM_D1SCLAIM0IfcalledwhiletheDefaultAllocatorisenabled,allfreememoryintheprocessheapisdisclaimed.1.4 mallopt示例1bladelrt:tmpcattestm.cpp#include<stdio.h>#include<sysshm.h>#include<stdlib.h>#include<malloc.h>ttinclude<errno.h>intmain(intargc,char*argv)char*p;intsize=8*1024*4096:p=(Char*)maIloc(size):mcmset(p,0,size);while(p!=NULL)(free(p);size=2;p=(char*)malIoc(size):memset(p,0,size);if(p=NULL)(printf(*errorencountered,mallocreturnNULL,error=%dn*,errno);else(printf(*sizeofmalloc=%dMBn*,size/(1024*1024);printf(*disclaim?YNn*);if(,Y*=getchar()mallopt(M_DISCLAIM,0);调用一次即可释放进程此前的私有freelistgetchar();)getchar();return0;)1.5 mallopt示例2AnothermalIoptexample:#include<iostream>#include<time.h>Itinclude<malloc.h>#include<stdlib.h>usingnamespacestd;voidmain()(cout«*Beginningprogram.Entertocontinue*«endl;constlongSizeOfArray=4*1024;chari:/pausebeforeallocatingcout«*wait*;getchar():cout«clock()/CLOCKS_PER_SEC«endl;char*pCsiZeOfArray:for(intj=0;j<sizefArray;j+)pCj=newchar4096;memset(pCj,0,4096):/pausebeforede-allocatingcout«*doneallocating16MB,pressentern*:getchar():for(intj=j<sizefArrayij+)deletepCj;cout«”donedeleting16MB,pressentern*;getcharO;cout«clock()/CLOCKS

    注意事项

    本文(AIX 进程内存分配与回收策略及应用开发建议.docx)为本站会员(王**)主动上传,优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知优知文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 yzwku网站版权所有

    经营许可证编号:宁ICP备2022001189号-2

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知优知文库网,我们立即给予删除!

    收起
    展开