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

【Linux经典面试题(如何查看一个进程的内存占用)】沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述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求和,是不是代表所有进程内存使用总和,答案是否定的,原因就是共享库,它是可以在多个进程之间共享的,共享库只会加载一次。



    推荐阅读