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字段值。
  • VIRT是申请的虚拟内存总量。
  • RES是进程使用的物理内存总和。
  • SHR是RES中”映射至文件”的物理内存总和。包括:
  •     程序的代码段。
        动态库的代码段。
        通过mmap做的文件映射。
        通过mmap做的匿名映射,但指明了MAP_SHARED属性。
        通过shmget申请的共享内存。

    /proc/<pid>/smaps内Shared_*统计的是RES中映射数量>=2的物理内存。
    /proc/<pid>/smaps内Private_*统计的是RES中映射数量=1的物理内存。

你可能感兴趣的:(top)