top命令展示的VIRT RES SHR值
top命令显示的VIRT RES SHR值
第一个值(VIRT)就是mm->total_vm,即进程虚存的总大小,这个比较清晰,只要进程申请了内存,无论是malloc还是堆栈还是全局,都会计入这个值;
第二个值(RES)是mm->file_rss+mm->anon_rss;
第三个值(SHR)是mm->file_rss。
RES要和SHR结合者看,内核把物理内存分为了两部分,一部分是映射至文件的,一部分是没有映射至文件的即匿名内存,完全和共不共享没有关系!
我们可以得到如下结论:
top命令通过解析/proc/<pid>/statm统计VIRT和RES和SHR字段值。
/proc/<pid>/smaps内Shared_*统计的是RES中映射数量>=2的物理内存。
/proc/<pid>/smaps内Private_*统计的是RES中映射数量=1的物理内存。
第一个值(VIRT)就是mm->total_vm,即进程虚存的总大小,这个比较清晰,只要进程申请了内存,无论是malloc还是堆栈还是全局,都会计入这个值;
第二个值(RES)是mm->file_rss+mm->anon_rss;
第三个值(SHR)是mm->file_rss。
RES要和SHR结合者看,内核把物理内存分为了两部分,一部分是映射至文件的,一部分是没有映射至文件的即匿名内存,完全和共不共享没有关系!
我们可以得到如下结论:
top命令通过解析/proc/<pid>/statm统计VIRT和RES和SHR字段值。
- VIRT是申请的虚拟内存总量。
- RES是进程使用的物理内存总和。
- SHR是RES中”映射至文件”的物理内存总和。包括: 程序的代码段。
动态库的代码段。
通过mmap做的文件映射。
通过mmap做的匿名映射,但指明了MAP_SHARED属性。
通过shmget申请的共享内存。
/proc/<pid>/smaps内Shared_*统计的是RES中映射数量>=2的物理内存。
/proc/<pid>/smaps内Private_*统计的是RES中映射数量=1的物理内存。