Linux经典面试题:如何查看一个进程的内存占用

这个问题本质上是想查看一下面试者对于Linux常用命令以及操作系统内存模型的认识情况。如果面试者能答上来一些常用的命令譬如:

  • top
  • pidstat
  • ps
  • pmap
  • /proc/$PROC/statm

说明基本了解了linux的常用命令,但这些命令的输出里面都包含各种参数细节。譬如Top里面RES的含义,如下

Linux经典面试题:如何查看一个进程的内存占用

又譬如常用ps命令里面。vsz、rss分别代表啥意思?

ps -o pid,user,vsz,rss,comm,args

这里涉及到Linux操作系统的内存模型和地址映射,每个用户态进程都只能看到操作系统分配的虚拟内存空间,从而完成进程的内存隔离,操作系统负责将进程看到虚拟地址映射到真实的物理地址。每个进程的虚拟空间又可以细分出堆、栈、代码段和数据段以及mmap映射段。

Linux经典面试题:如何查看一个进程的内存占用

这些虚拟内存并不是进程创建的时候就直接分配的,而是操作系统懒加载的,用的时候通过缺页异常临时分配的。这里最重要的有两个概念RSS和VSZ,其中RSS是常驻内存,代表真实分配的物理页,包括了堆、栈以及共享库,但不包括swap。而VSZ代表分配的虚拟页,只要是向操作系统申请的空间都算,即便被swap出去的也算。

举个例子:一个进程本身的二进制有500K,加载内存400K,链接共享库2500K,但加载了1000K, 堆+栈分配了200K,但真实使用了100K。那么它的计算方式如下:

RSS: 400K + 1000K + 100K = 1500K
VSZ: 500K + 2500K + 200K = 3200K

可以看到RSS代表真实使用的,而VSZ代表分配的。这里还有个小坑,如果面试官问你所有进程的RSS求和,是不是代表所有进程内存使用总和,答案是否定的,原因就是共享库,它是可以在多个进程之间共享的,共享库只会加载一次。

原文:https://www.toutiao.com/a6979715948802507295/?log_from=33f4b74b80a62_1631107354720

Guess you like

Origin blog.csdn.net/daocaokafei/article/details/120189355