栈(Stack):包含返回地址、主动分派的变量,都是一会儿有一会儿没的,体系主动收受接收,不会造成内存泄漏。
代码段:过程跑起来肯定要有代码,代码根本上可以说是固定大年夜小的,不会造成内存泄漏。当然如不雅代码太大年夜,装一向内存,那就另当别论了。
剩下的数据段就是过程本身分派、应用的分页,数据段包含Data + BSS + Heap。

Heap(堆)是过程中malloc, realloc等函数申请的,须要free等函数释放。
3. 举例
ps gv敕令中SIZE就是该过程数据段的virtual size(1KB为单位),这些分页可能在物理内存中也可能在Paging Space中。
检查SIZE列在经久的测试过程中是否有明显的持续增长,如有,解释可能有内存泄漏。
在稳定性测试(也叫持久测试或疲惫测试)中,须要不雅察内存是否有泄漏。然而应用内存的过程千切切,全部办事器的内存增长似乎也不克不及断定某个过程的内存有泄漏。是以在稳定性测试过程中往往须要全程存眷指定过程的内存消费,比如运行3天、7天。

经久的抓取和后期的图形化处理,可以写脚本或代率攀来实现
其他敕令也可以看到这个值,以下图为例“svmon –P 过程号”可以看work process private的virtual大年夜小+work shared library data的virtual大年夜小。如不雅有text data BSS heap、USLA heap、application stack、private load data等segment,还需把这些segment也加上。因为svmon中统计的segment较多,是以不推荐采取svmon统计Data Segment。
二者的单位是4K的分页。(169+85)4=2544=1016,与ps v获得的SIZE值雷同。
AIX膳绫擎过程空间的虚拟内存分页默认的页大年夜小是4K,但POWER5+以上的处理器支撑4种页大年夜小,分别是4KB(small),64KB(medium),16MB(large)和16GB(huge),POWER6处理器开端支撑4K和64K的混淆情势,即一个segment琅绫擎既有4K分页,也有64K分页,当须要大年夜块内存、须要晋升机能的时刻用64K分页,当64K分页可能会浪费内存的时刻则用4K分页。svmon敕令须要告诉用户这个segment有若干内存,为了统计时的便利,就只用一个单位来度量,这个单位就是sm中的第一个字母s(small),对应的度量单位是4K,这个笔记录后面的列中的数据都根据这个度量单位出具。
别的解释一下inuse和virtual。Svmon琅绫擎的inuse指的是这个过程对物理内存的消费,包含计算内存+非计算内存。而virtual指的是过程空间琅绫擎的分页,这个分页也许在物理内存,也许在Paging Space。假如说一个过程应用的分页都在物理内存的话,inuse>=virtual,因为此时inuse琅绫擎有文件缓存,而virtual琅绫擎没有文件缓存,文件缓存是操作体系给缓存的,和过程空间没紧要。
3)代码段:Code Segment
查看virtual字段
也可以Topas,敲击P,看指定过程的PAGE SPACE,也是254,254*4=1016,与ps v获得的SIZE值雷同。

这里的PAGE SPACE的单位是4KB,比较好查,只要man topas就可以找到这一段:PAGE SPACE:The virtual working set size used by process (4 KB pages)
有人会问,为什么不大年夜nmon琅绫擎取值?nmon的TOP Sheet琅绫擎的过程也有SIZE等内存的指标,但nmon的TOP Sheet中只列出占CPU比较多的N个过程,如不雅被监控的过程占CPU很低,就不会涌如今TOP Sheet中。或者一开端被监控过程占CPU较多,后来竽暌股于它占用的CPU削减而大年夜TOP sheet中移除了,那么我们并不知道这个过程是烧毁了照样CPU应用率太低了。
过程应用的共享内存段
除了Data Segment可以造成内存泄漏,如不雅过程分派共享内存,也可能造成内存泄漏。
共享内存是某个过程分派,其他过程可以拜访的内存段,共享内存会映射到每个过程的地址空间。

那么若何查看指定过程消费的共享内存呢?

大年夜过程空间的角度看,共享内存段在这里
起首,照样要介绍概念,共享内存在AIX上可能有两种内存段:shared memory segment和memory mapped segment。为什么竽暌剐两种段呢?这是因为法度榜样调用了不合的实现接口导致的(System V Shared Memory services (shmat) 和BSD Memory Mapped Services)。BSD Memory Mapped Services可以将文件直接映射到内存而省去中心的buffer,但它也可以用来创建共享内存,它创建出来的共享内存段就是memory mapped segment。
1. 获取来源
查看指定过程消费的共享内存的具体办法如下:
32位法度榜样
svmon -P过程号| egrep "Vsid|shared memory|mmap maps"
64位法度榜样
svmon -P过程号| egrep "Vsid|shmat/mmap"
BSS是未初始化的全局和静态变量,比如static int i。
2. 指标解释
如不雅查出来某个内存段是memory mapped segment类型的,这个segment琅绫擎是不是共享内存,须要用ipcs –mS帮助断定(因为memory mapped segment也可能是文件直接映射内存)。ipcs查到的都是共享内存,是以可以经由过程svmon –P中这个段的Vsid( virtual segment ID)在ipcs中查找有没有这个段号。
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散哈希传递对于大年夜多半企业或组织来说仍然是一个异常棘手的问题,这种进击手段经常被渗入渗出测试人员和进击者们应用。当谈及检测哈希传递进击>>>详细阅读
本文标题:如何判断内存是否泄露及何处泄露
地址:http://www.17bianji.com/lsqh/39652.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示