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的

时间: 09-05

linux 程序占内存,linux概念之程序占用内存相关推荐

  1. 桌面内存管理器(dwn.exe)占用内存过高时怎么办?

    桌面内存管理器(dwn.exe)占用内存过高,可以解决的办法多种多样. 桌面内存管理器(dwn.exe)占用内存过高主要是因为存在DWM内存泄漏, 也正是因为这样,DWN内存泄露,不会自动回收内存,导 ...

  2. linux 系统日志 查看被杀掉的进程(占用内存过大)

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  3. 小程序占服务器空间吗,小程序会占用手机存储空间吗?| 小程序问答 #21

    原标题:小程序会占用手机存储空间吗?| 小程序问答 #21 使用小程序,到底会不会占用手机存储空间呢? 答案是:当然会. 小程序会占多少储存空间? 小程序所占用的手机存储空间,主要有以下两个部分: 首 ...

  4. java内存问题怎么排查,java占内存高排查 java应用占用内存过高排查的解决方案...

    想了解java应用占用内存过高排查的解决方案的相关内容吗,zhaixing_0307在本文为您仔细讲解java占内存高排查的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:java,占内存过 ...

  5. win10msmpeng占内存_彻底解决win10 占用内存高的办法

    希望大家多多转发,帮助更多的人 必要前提:系统不能有任何已安装更新包 因为有个更新包bug (不知道哪个)导致内存(我是8G DDR2133)飙高 16G  32G也抗不住 网上方法都是废话没一个靠谱 ...

  6. cocos-js,内存管理2---计算图片占用内存

    一.1张图片内存如何计算 一张图片占用的内存由以下两个因素决定: 图片的像素点个数 单位像素占用的字节数 其中图片的像素点个数是图片的宽度与长度的积,所以一张图片占用的内存值为: 图片长度 * 图片宽 ...

  7. PHP占用内存越来越多,解决phpQuery占用内存过多的问题

    本节内容: phpQuery占用内存过多的问题 phpQuery是一个用php实现的类似jquery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素. 相对于正则或其它方式匹配网页方式, ...

  8. mysql占用内存过高_mysql数据库占用内存过高解决办法

    top命令查看系统的实时负载, 包括进程.CPU负载.内存使用等等: 直接输入top命令 PID:PID进程 USER:用户 PR:优先级 NI:nice值,负值表示高优先级,正值表示低优先级 VIR ...

  9. 和平精英修改服务器内存,和平精英:更新占用内存太多,玩家手机顶不住,一招教你解决!...

    原标题:和平精英:更新占用内存太多,玩家手机顶不住,一招教你解决! 大家好,欢迎大家来到孟婆小叔开讲的<和平精英>"吃鸡小课堂".新版本更新的时候光子曾经提醒大家,安装 ...

  10. 记几次被恶意挖矿程序占满linux服务器cpu的经历

    过程一: 1. 发现cup爆满 当我部署项目时启动不了,tomcat启动不了,然后我发现cup爆满,然后查看用top查看进程 然后我再查看pstree进程树 2.杀死进程 kill -9  pid 杀 ...

最新文章

  1. 那些巨头公司的前端面试都喜欢问些什么?
  2. 基于Vuejs+ElementUI的答案录入功能的一些总结
  3. Python 初学者的最佳学习资源
  4. android最大json,Android:解析大型JSON文件
  5. Oracle学习(五)DBLINK
  6. 页面复杂对象传递参数 开发中遇到的问题
  7. vba结束本次循环进行下次_VBA掌握循环结构,包你效率提高500倍
  8. openlayers之EPSG3857
  9. QQ号终于可以当传家宝了!没车没房的,就留几个游戏账号给儿子吧?
  10. 基于队列的迷宫求解实现
  11. Spring知识点总结-3
  12. SQL语句中AND OR运算符优先级
  13. 今天终于搞懂了:为什么Java的main方法必须是public static void?
  14. MQTT采集协议转换器转103 104 cdt 61850动环工业网关可定制试用
  15. 5个超厉害的资源搜索网站,每一款都可以让你的资源满满!
  16. ssh secure shell:server responded algorithm negotiation failed
  17. 2021年全国职业院校技能大赛获奖名单(高职组网络系统管理)
  18. cordon,drain
  19. 朝花夕拾——动态规划
  20. CQF量化金融职业指南

热门文章

  1. shiro+redis实现session共享
  2. 杀死linux-zombie僵尸进程
  3. LINUX基本命令行手册一
  4. Date String转换
  5. ASP.NET MVC 4 (三) 过滤器
  6. python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
  7. golang 切片copy复制 和 等号复制 区别
  8. python 报错 SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1076) 解决方法
  9. jenkins 漏洞集合 简介
  10. linux 编译错误 configure: error: no usable python found at /usr/bin/python2.7