top 命令里内存参数 VIRT、RES、SHR的区别

VIRT、RES 、SHR

某系统在某时刻执行top命令后输出结果示例如下:

top - 22:55:28 up 86 days, 23:18,  1 user,  load average: 0.26, 0.28, 0.18
Tasks: 112 total,   3 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s): 25.4 us, 17.5 sy,  0.0 ni, 54.0 id,  2.4 wa,  0.0 hi,  0.8 si,  0.0 st
MiB Mem :   1711.1 total,    352.4 free,    338.8 used,   1019.9 buff/cache
MiB Swap:   2048.0 total,   1828.7 free,    219.3 used.   1039.3 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                            
1500910 root      20   0 1052596  92728  16580 S   6.2   5.3 433:50.25 YDService                                                                                          
      1 root      20   0  252980   6004   3212 S   4.7   0.3  45:46.11 systemd                                                                                            
 727195 root      20   0 2329448  50632  20984 S   4.7   2.9  38:26.15 dockerd                                                                                            
    545 dbus      20   0   57124   2012   1236 S   3.1   0.1  15:30.78 dbus-daemon                                                                                        
     15 root      20   0       0      0      0 S   1.6   0.0   4:34.27 ksoftirqd/1                                                                                        
    459 root      20   0  108488   2352   1956 S   1.6   0.1   6:38.13 systemd-udevd                                                                                      
    855 root      20   0  591084   3004   1488 S   1.6   0.2  16:27.99 NetworkManager                                                                                     
    867 root      20   0 1103544  22080  10828 S   1.6   1.3 294:21.40 fail2ban-server                                                                                    
    871 root      20   0 1955844  17416   6100 S   1.6   1.0  61:44.87 containerd                                                                                         
 472107 root      20   0  101700   2844   2208 S   1.6   0.2  17:08.83 systemd                                                                                            
 814864 root      20   0  269216   4652   3904 R   1.6   0.3   0:00.02 top                                                                                                
3129598 root      20   0  931508  18724   3352 S   1.6   1.1   1222:50 barad_agent                                                                                        
      2 root      20   0       0      0      0 S   0.0   0.0   0:02.92 kthreadd          

在下面的进程信息中默认看到有关于VIRT、RES 、SHR 这 3 项内存状态,区别如下:

  • VIRT :Virtual Memory Size,表示的是进程虚拟内存空间大小。是真实使用的内存,加上映射进程自己使用的内存,加上映射磁盘文件使用的内存(主要是加载共享程序库文件), 加上与其他进程共享的内存。VIRT代表进程当前时刻有多少内存可以访问。
  • RES:Resident Memory Size,是指进程虚拟内存空间中已经映射到物理内存空间的那部分的大小。意味驻留内存大小,,是当前进程真正占用物理内存的精确反映。(直接与 %MEM 列相对应) RES 始终要比 VIRT 小,因为多数程序依赖 C 库文件。
  • SHR:Shared Memory Size :它表示的是进程占用的共享内存大小。表示虚拟内存 VIRT 中实际可共享部分(内存或库文件)。对于库文件而言,并不是整个的库文件都会驻留在内存中。如果程序仅用到了库文件里的少数函数,整个库文件会映射并被计算到 VIRT 和 SHR 里,但只有库文件包含用到的函数那部分真正加载到内存并被计算到 RES 里。

从区别上看,就不得不了解 Linux 系统的虚拟内存(Virtual Memory)和驻留内存(Resident Memory)两个概念。

虚拟内存和物理内存

虚拟内存

首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼但是它们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理(process address space management)而精心设计的一个逻辑意义上的内存空间概念。

虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中需要被访问的部分会被映射到物理内存空间中。虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大。

物理内存

驻留内存,顾名思义是指那些被映射到进程虚拟内存空间的物理内存。

进程的驻留内存就是进程实实在在占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

参考:

https://segmentfault.com/a/1190000013504502

https://zhuanlan.zhihu.com/p/564178446