进程使用的共享内存段
除了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"
查看virtual字段
2、 指标说明
如果查出来某个内存段是memory mapped segment类型的,这个segment里面是不是共享内存,需要用ipcs –mS辅助判断(因为memory mapped segment也可能是文件直接映射内存)。ipcs查到的都是共享内存,因此可以通过svmon –P中这个段的Vsid( virtual segment ID)在ipcs中查找有没有这个段号。
这里没有现成的例子,只是截个示意图
ipcs –mS看到的是所有共享内存段,而没有段的大小。如果看段的大小可以加-b选项。需注意,-b选项看到的是可分配的最大值,而不是已分配的。
SEGSZ的单位是Byte。-b列出共享内存段以及消息、信号量的最大值,也就是可分配的最大值,而不是已分配的(数据库程序除外)。-m列出活动的共享内存段。