AIX 进程内存分配与回收策略及应用开发建议.docx
《AIX 进程内存分配与回收策略及应用开发建议.docx》由会员分享,可在线阅读,更多相关《AIX 进程内存分配与回收策略及应用开发建议.docx(33页珍藏版)》请在课桌文档上搜索。
1、目录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定
2、位3.2 内存非法使用检查3.3 内存泄漏检查(report_allocations)3.4 内存泄漏检查示例3.5 proctools介绍3.6 probevue介绍如何将C文件与汇编文件对应1.AlX内存分配回收策略一般而言,系统会直接在进程空间的free列表中维护其free释放的内存,以供后续新的分配直接使用,这样可以提高分配效率,不需要每次内存分配都经过系统内核。进程退出后,系统会回收该进程占用的全部内存。注:选择不同的分配策略时,对空闲内存空间的管理策略会有所差异。例如默认的管理结构是CarteSian树;而采用WatSon分配算法时,使用的管理结构是红黑树。Cartesian笛卡尔
3、树参考结构:DeaeasrglengthsROOTInereaSngaddresses1.1 内存分配观察示例一递增分配进程的详细内存分配情况可以使用SVmon来观察,参考如下示例。需要注意,为方便svmon观察,示例代码需要在malloc之后调用memset进行初始化;因为操作系统实际上并不会立即对已申请但尚未访问到的内容分配实际存储空间,而是推迟到第一次访问时才会实际分配一这即是缺页机制的工作原理。如下是一个申请空间递增的应用,分配/释放大小为2MB-4MB-8MB-16MB,则通过各阶段的svmon可以看到,内存页面会持续增长,从2MB一直增力口到16MB(注意不是2MB+4MB+.+1
4、6MB=30MB)oManOC分配2MB,未初始化时:rtanzga:/#svmon-11rP909436PidCommandInusePinPgspVirtual64-bitMthrd16MB909436testm165848841727YNNVsidEsidTypeDescriptionPSizeInusePinPgspVirtual2cba711worktextdataBSSheaps2002AddrRange:0.512839b2ffffffffworkapplicationstacks2002AddrRange:65534.65535AddressRange为0512页,即代表512
5、4096=2MB虚拟地址空间。VirtUaI取值为2,表示该空间尚未实际分配。初始化后:2cba711worktextdataBSSheaps51300513AddrRange:0.512VimIaI取值为513,表明虚存空间已经实际分配。释放之前申请的2MB,重新申请4MB并初始化后:2cba711worktextdataBSSheaps1025001025AddrRange:0.102410244096=4MB,此前释放的512页虚拟地址空间被重复利用。释放之前申请的4MB,重新申请88MB并初始化后:2cba711worktextdataBSSheaps2049002049AddrRan
6、ge:0.2048此前释放的1024页虚拟地址空间被重复利用。释放之前申请的8MB,重新申请16MB并初始化后:2cba711worktextdataBSSheaps4097004097AddrRange:0.40961.2 内存分配观察示例一递减分配如示例,如果是一个申请空间递减的应用,分配/释放大小为16MB-8MB-4MB-2MB,通过各阶段的svmon(svmon-nrP)可以看到,内存页面始终维持在16MBoMaIk)C分配16MB,未初始化时:VsidEsidTypeDescriptionPSizeInusePinPgspVirtualbl41411worktextdataBSSh
7、eaps2002ddrRange:0.40962cba7ffffffffworkapplicationstackAddressRange为04096页,即代表4096X4096=16MB虚拟地址空间。InuseZVirtual取值为2,表示该空间尚未实际分配。初始化后:VsidEsidTypeDescriptionPSizeInusePinPgspVirtualb!41411worktextdataBSSheaps4097004097AddrRange:0.4096Virtual=4097页,虚拟内存已经实际分配。释放之前申请的16MB,重新申请88MB并初始化后:b!41411worktex
8、tdataBSSheaps4097004097AddrRange:0.4096释放之前申请的8MB,重新申请44MB并初始化后:bl41411worktextdataBSSheaps4097004097AddrRange:0.4096释放之前申请的4MB,重新申请22MB并初始化后:bl41411worktextdataBSSheaps4097004097AddrRange:0.4096可以看到SVmOn输出结果没有变化;原因是虽然应用调用了free释放了16MB内存,但系统的处理策略是将该内存置于进程自身的空间块树中管理。下一个8MB分配,实际上是直接从进程已有的16MB空闲块中获取的。但对
9、系统而言,进程管理的空闲块树也对应为该进程的内存消耗,所以其内存占用没有变化。测试代码:#includeinclude!includeintmain(intargc,char*argv)(char*p;intsize=1024*4096;intindicator;if(argc2)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);
10、size=2;/如果用递增,则size*=2;p(char*)malloc(size);memset(p,0zsize);if(p=NULL)(printf(nerrorencountered,mallocreturnNULL,error三%dn,errno);else(printf(sizeofmalloc三dMB,pressenternsize/(1024*1024);)getchar();1getchar();return0;1.3 针对长运行程序的空闲内存回收由于上面介绍的内存使用方式,一个常见的现象是,对于长运行进程,其占用的私有内存大小等同于最高峰时间的内存大小。这个现象一般而言,
11、对系统正常运行及性能的影响很小。因为如果系统空闲内存足够,这个问题不存在。而如果内存不足,由于进程本身的空闲块列表没有被引用,根据换页算法,在系统缺页(即可用内存不足)时,很容易被换出。但如果应用进程希望对其空间内存块进行更自主的管理,可以使用mallopt接口。例如,对长运行的程序,定期在其闲时(例如每周日凌晨业务量极低时),调用mallopt(M_DISCLAIM,0)释放进程私有空间的free列表。这样可以避免在程序本身没有内存泄漏的情况下,因业务高峰期大量的内存申请造成的进程私有freelist增长,而使得进程内存占用过大。实现起来也相当简单(参考如下mallopt示例)。参考mall
12、opt函数的帮助信息:CommandValueEffectM_D1SCLAIM0IfcalledwhiletheDefaultAllocatorisenabled,allfreememoryintheprocessheapisdisclaimed.1.4 mallopt示例1bladelrt:tmpcattestm.cpp#include#include#include#includettincludeintmain(intargc,char*argv)char*p;intsize=8*1024*4096:p=(Char*)maIloc(size):mcmset(p,0,size);while
13、(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
14、.5 mallopt示例2AnothermalIoptexample:#include#includeItinclude#includeusingnamespacestd;voidmain()(cout*Beginningprogram.Entertocontinue*endl;constlongSizeOfArray=4*1024;chari:/pausebeforeallocatingcout*wait*;getchar():coutclock()/CLOCKS_PER_SECendl;char*pCsiZeOfArray:for(intj=0;jsizefArray;j+)pCj=new
15、char4096;memset(pCj,0,4096):/pausebeforede-allocatingcout*doneallocating16MB,pressentern*:getchar():for(intj=jsizefArrayij+)deletepCj;cout”donedeleting16MB,pressentern*;getcharO;coutclock()/CLOCKSPERSECendl;/ReturnthememorytosystemmalIopt(M_DISCLAIM,NULL);/pauseafterde-allocatingcout”donedeallocatin
16、gmemoryn”;getchar();)1.6 内存回收disclaim策略如果需要设置使得系统在应用调用free之后,即回收其内存,可以在程序启动前设置环境变量(这两种方式都可能对程序性能有很大影响):PSALLOC=early或者MALLOCOPTIONS=disclaim由于PSALLOC=early实际上意味着设置MALLOCOPTIONS=disclaim,且提前分配PagingSpace;所以其性能开销还要高于MALLOCOPTIONS=disclaimo但这种机制能够避免PagingSpace耗尽时,进程被系统kill掉的可能;详情可以通过在如下aixinfocenter网站查
17、询PSALLOC获取。注:老的MALLOCTYPE=3.1也有此效果,但该分配策略往往性能一般,且只适用于32位程序,现在的系统一般不使用了。在设置环境变量MALLOCTYPE=Watson的情况下,mallopt(M_DISCLAIM,0)无效;1疝0向乂_口(21,0)只对系统默认的分配策略(即cartesian树分配算法)有效。也可以在代码中直接用disclaim调用。注意disclaim调用需要在free/delete之前;超过4G的内存块需要使用disclaim64函数。1.7 disclaimdisclaim64代码示例blade1:root:/trapcattestm.cpp#i
18、nclude#include*include#includeintmain(intargc,char*argv)(char*p:intsize=10000000;p三(Char*)ma1Ioc(size);InemSeI(p,0,size):while(p!=NULL)(discIaim(char*)p.size,ZERO_MEM);/disclaimshouldcomesbeforefreesubroutine/forsize=4G,disclaim64shouldbeused.free(p):size=2;p=(char*)malIoc(size):memset(p,0,size);/sh
19、ouldraemsetforthepagestobeactuallyallocated.if(pNULL)printf(*errorencountered,malIocreturnNULL,error=%dn*,crrno);)else(printf(*sizeofmalIoc=%dMBn*,size/(1024*1024):getchar():getchar();return0;1.8 内存碎片对内存回收的影响需要注意的是,上面各种释放进程私有空闲内存列表的方法,在应用出现严重内存碎片的情况下,都存在不足。这种情况需要实际应用程序通过合理设计,避免严重内存碎片。例如一些缓存数据库表的数据结构
20、,可能涉及大量记录的增删,且一般不会一次性全部删除,类似这种情况可能最终造成严重内存碎片;从而使得进程私有空间无法有效回收,只能存在于进程自身的私有freelist中。举一个极端的例子,一个进程申请了4000页内存,但释放时,恰好在每个内存页上保留了一个16字节的数据结构(其他空间均释放)。这样进程的私有内存空间实际上无法进行收缩。因为maHopt(M_DISCLAIM,0)和disclaim等方法都需要以多个页面为单位进行实际回收。但如果应用设计良好,一般可以避免这类问题:例如一些事务性的应用,在事务处理开始时,大量申请内存;在处理结束后,就将这些内存释放。这种情况下,出现大量内存碎片的概率
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AIX 进程内存分配与回收策略及应用开发建议 进程 内存 分配 回收 策略 应用 开发 建议

链接地址:https://www.desk33.com/p-1163692.html