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

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

(1). ps aux:html

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

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

虚拟内存能够不用考虑,它并不占用实际物理内存。程序员

(2). top 命令也能够缓存

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

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

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

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

但因为 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内存使用详解,写的比较详细,比较细致,也比较专业。

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

(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的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值