• 在linux下,查看一个运行中的程序, 占用了多少内存


    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有

       (1). ps aux:

         其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存。

               RSS列 表示, 程序占用了多少物理内存。

               虚拟内存可以不用考虑,它并不占用实际物理内存。

       (2). top 命令也可以

         其中  VIRT(或VSS)列  表示,程序占用了多少虚拟内存。 同 ps aux 中的 VSZ列

               RES列 表示, 程序占用了多少物理内存。同 ps aux 中的RSS列

               

    2.在linux下, 查看当前系统占用了多少内存, 一般的命令是  free

    其中, free就是系统还有多少内存可以使用。

    但由于 linux 系统对内存使用有一个原则, 就是, 内存是宝贵的, 能使用多少就使用多少。 所以, linux会把已经调用过的包缓存起来,放在内存里。

    这样,实际上,可以使用的内存,就可以理解为, free+buffers+cached

    3.当你了解完这些命令以后, 再去使用ps aux 命令去查看的时候, 会发现一个奇怪的现象。

     所有的  RSS 列的数据,加起来, 比物理内存的数要大很多。

     比如, 物理内存为2G, 而RSS列的数据加起来,可能有5个G之多, 这是怎么回事了?

     这是因为RSS列的值骗了我们。 

     linux的内存机制是这样的:

     在运行一个程序时, linux会调用该程序依赖的链接库, 如lib.xx.so。 首先看该链接库是否被映射进内存中,如果没有被映射,则将代码段与数据段映射到内存中,否则只是将其加入进程的地址空间。

     这样,当N个程序,依赖到lib.xx.so的时候, 实际上,内存中只有一个lib.xx.so ,而不是N个。 

     而RSS在显示一个程序占用的实际物理内存时, 将lib.xx.so也算了进来。

     比如, X程序, 本身占用内存为5M, lib.xx.so 占用内存2M,lib.xx.so被N个程序共享依赖。 则RSS显示为,X程序运行,占用内存为7M。 实际上, X程序占用了5M空间。 多余的2m被讨入到RSS中了。

     当你在用ps aux显示内存占用情况时, N个共享依赖lib.xx.so的N个程序,都把这2m空间,算在自己的RSS中了, 这样RSS的sum值,就比实际物理内存多了。

     当然, linux的内存使用机制很复杂, 不是一句两句能说清楚的。这里只是简单的说明了一下, ps aux中的RSS值, 并不能真实反映物理内存的使用情况。

    4. 如果查看更详细的内存使用情况, 可用以下几种方法, 或者几种方法结合使用:

    这几种方法,都需要root账户的权限

    (1). pmap -d $pid 

    $pid 是正在运行的程序的pid

    (2). cat /proc/$pid/smaps

      smaps的数据比较详细,可简单的归纳一下,归纳的命令如下:

      cat /proc/$pid/smaps  | awk '/Size|Rss|Pss|Shared|Private|Referenced|Swap/{val_name=gensub(/([a-zA-Z_]*).*/,"\1",1,$1); list[val_name]+=$2; }END{for(val in list)print val,list[val];}'                     

    (3). cat /proc/$pid/maps

    (4). cat /proc/$pid/statm

    输出解释

    第一列  size:任务虚拟地址空间大小
    第二列  Resident:正在使用的物理内存大小
    第三列  Shared:共享页数
    第四列  Trs:程序所拥有的可执行虚拟内存大小
    第五列  Lrs:被映像倒任务的虚拟内存空间的库的大小
    第六列  Drs:程序数据段和用户态的栈的大小
    第七列 dt:脏页数量

  • 相关阅读:
    Mysql 三大特性详解
    MySQL Innodb日志机制深入分析
    Bootstrap学习地址
    Java【锁】
    Java【tomcat】配置文件
    nginx配置文件详解【nginx.conf】
    Sqlserver2008[索引]
    网络知识
    RestClient火狐接口测试地址
    java基础1JDK各大版本下载地址
  • 原文地址:https://www.cnblogs.com/onmyway20xx/p/4398212.html
Copyright © 2020-2023  润新知