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:脏页数量

(5). vmstat

这个命令据说也可以提供一些参考信息,具体还未研究

5.作为phper,尝试过使用php的函数memory_get_usage(), 该函数也不能得到php当前运行的程序,实际的,真正占用的内存数量。

如果真想得到,php真正占用的内存, 大概只能在, 程序运行的开始,执行一次memory_get_usage().

在程序运行结束,执行一次memory_get_usage()。 将两者的值相减,得到的值, 应该是一个相对比较准确的,内存占用数量了。

这个方法还没有测试, 考虑到, 得到这个数量,也没有实际意义, 加上平时又比较忙,懒得试了。

也许php还有一个方法, 是使用shm_* 系列函数, 这也我也未深入研究,详见这篇文章(http://duckweeds.blog.sohu.com/166663796.html)

6.另外还有一些文章可以参考,如下:

(1)一个C程序员, 眼中的Linux内存使用详解,写的比较详细,比较细致,也比较专业。

(2)对 /proc/pid/statm的详细说明

(3)简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析

(4)php 共享内存的使用

(5)Memory Usage with smaps

(6)Capturing Process Memory Usage Under Linux,这篇文章似乎是对一个产品的广告,但里面对USS,PSS,RSS 这几个概念有详细的解释

(7) ELC: How much memory are applications really using跟(6)一样,是对同一个产品的广告,文章里有一些东西可以参考

(8) Linux Check Memory Usage,文章对 free, vmstat,top , gnome-system-monitor等命令有一些介绍

(9)Console Monitoring Tools for SUSE Linux,对top,free,uptime,pmap,smartctl,iostat,strace等命令有所介绍,并且介绍的比较详细,目前只是粗略的看了一下,有时间还要再看看。

(10)Solaris 9 Enhanced pmap,比较详细的介绍了pmap的应用,不过是基于Solaris 9的

linux下,一个运行中的程序,究竟占用了多少内存的更多相关文章

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

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...

  2. 在linux下,怎么去查看一个运行中的程序, 到底是占用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...

  3. linux下命令运行目录上程序前面要加./

    linux命令行上默认运行path系统变量的路径的程序,所以我们在运行时命令时会在系统变量中查找,而发现查找完系统变量之后是不会再查找当前目录的. 有以下方式解决: 1.在运行当前目录的程序时,前面加 ...

  4. WINDOWS中, 如何查看一个运行中的程序是64位还是32位的

    转自:https://blog.csdn.net/dayday3923/article/details/78597453?locationNum=7&fps=1 方法一: 任务管理器法任务管理 ...

  5. Memcahce(MC)系列(两)Linux下一个Memcache安装

    Linux下一个memcache安装 memcache是高性能.分布式的内存对象缓存系统,用于在动态应用中降低数据库负载.提升訪问速度.眼下用memcache解决互联网上的大用户读取是很流行的一种使用 ...

  6. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  7. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

  8. [转载]linux下编译php中configure参数具体含义

    编译N次了   原来这么回事 原文地址:linux下编译php中configure参数具体含义作者:捷心特 php编译参数的含义 ./configure –prefix=/usr/local/php ...

  9. Linux下使用vim编辑C程序

    这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...

随机推荐

  1. ThinkPHP 表单自动验证运用

    使用TP 3.2框架 public function add_post(){ //验证规则 $rule=array( array('name','require','请输入姓名',1),//必须验证n ...

  2. Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 二分

    C. GukiZ hates Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. thinkphp3.2笔记(4)模板函数的使用 foreach标签

    一  模板函数的使用 1.代码 效果: 函数会按照从左到右的顺序依次调用.如果你觉得这样写起来比较麻烦,也可以直接这样写:{:substr(strtoupper(md5($name)),0,3)} 默 ...

  4. Solaris11 Vsphere client tool 的鼠标问题

    Mouse does not function on a Solaris 11 virtual machine (2040498) http://kb.vmware.com/selfservice/m ...

  5. 将keras模型在django中应用时出现的小问题——ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 8), dtype=float32) is not an element of this graph.

    本文原出处(感谢作者提供):https://zhuanlan.zhihu.com/p/27101000 将keras模型在django中应用时出现的小问题 王岳王院长 10 个月前 keras 一个做 ...

  6. CSS 列表样式详解

    CSS列表用于前端的列表排列. CSS列表属性作用如下: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 列表 在HTML中,有两种类型的列表: 无序列表 - 列 ...

  7. HDU - 4812 D Tree 点分治

    http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...

  8. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  9. NYOJ 720 DP+二分

    项目安排 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个 ...

  10. Leetcode 64

    class Solution { public: int minPathSum(vector<vector<int>>& grid) { int n = grid.si ...