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

3618人阅读
嵌入式开发(15)
用free查看到的是整个系统的,用top看到的是所有的程序.
然后shift + m(按占用内存大小排序)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:96499次
积分:1297
积分:1297
排名:千里之外
原创:25篇
转载:31篇
评论:13条
(1)(1)(14)(6)(8)(4)(6)(9)(4)(3)对一个程序在内存中的分析_Linux教程_Linux公社-Linux系统门户网站
你好,游客
对一个程序在内存中的分析
来源:Linux社区&
作者:bullbat
内存管理是操作系统的核心;它对于程序员和系统管理员都很关键。在接下来的几篇文章里面我将对内存的关键技术做谈论,但是不会远离其本质。然而概念很普通,例子多半来自32位X86系统的LINUX和Window操作系统。这第一篇文章谈论程序在内存中如何存放。
在多任务操作系统中的每一个进程运行在他自己的内存地址空间中。这个地址空间就是虚拟地址空间,虚拟地址空间在32位模式下总是4GB大小的内存地址。这些虚拟地址用页表方式映射物理内存,页表由操作系统内核维护,由处理器访问。每个进程有自己的页表集合,但这里有个难以理解的地方。一旦虚拟地址(作者的意思也就是分页机制)开启,它应用与所有正在运行与机器上的软件,包括内核自身。这样一部分虚拟地址空间必须保留用于内核:
这并不意味着内核使用那么多物理内存,只是他运用那部分可用的地址空间去映射他实际希望的物理内存大小。内核空间在页表中标志为特权级代码(等级小于等于2),这样当用户模式程序访问他时就会触发一个访页错误。在LINUX中,内核空间一直处于当前状态并且在所有进程中映射到相同的物理内存。内核代码和数据在任何时候总是为中断服务和系统调用做好寻址的准备。相反,用于映射用户模式的地址空间部分将会在进程切换的时候发生改变。
蓝色区域代表已经映射物理内存的虚拟地址,白色区域为没映射部分。在上面的例子中,Firefox由于他的巨大的内存需求,已经使用了他的大部分虚拟地址空间。地址空间中不同的带对应内存段如堆、栈等等。需要注意的是这些段就是简单的内存地址范围,他和Intel汇编中的”段”不相干。下面是在LINUX进程中标准的段视图:
当计算安全时,如上面的段所示,对于机器中的几乎每一个进程的开始虚拟地址都相同。这使得很容易远程利用安全漏洞。一个漏洞,往往需要引用绝对内存位置:栈上的地址,库函数的地址,等等。远程攻击必须盲目地选择这个内存位置,正指望这所有的地址空间都是一样的。如果真是这样,那么太容易被攻击了。故而地址空间的随机化就变得通用了。LINUX以在栈、内存映射段和堆的起始地址加上偏移的方式随机化他们。不幸的是,32位地址空间很紧缺,留下很少的空间用来做随机化从而牵制了他的有效性。
进程地址空间中最上面的段为栈,很多语言中栈用于存储本地变量和函数参数。调用一个方法或函数时压入栈一个新的栈帧。当函数返回时,这个压入的栈帧被释放。这个简单的设个,可能是因为数据遵循严格的FIFO次序,这意味着再复杂的数据结构都无需跟踪栈内容——一个简单的栈顶指针将会做跟踪作用。这样入栈和出栈非常快速和准确。进一步,堆栈地区不断重用,往往在CPU缓存中持有活跃的栈内存,加快存取。进程中的每个线程获得他自己的栈。
相关资讯 & & &
& (07/28/:23)
& (11/03/:38)
& (06/06/:40)
& (01/28/:00)
& (10/07/:52)
& (05/15/:55)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款博客访问: 163923
博文数量: 40
博客积分: 1807
博客等级: 上尉
技术积分: 350
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 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_* 系列函数, 这也我也未深入研究,详见这篇文章()
&6.另外还有一些文章可以参考,如下:
&(1)一个C程序员, 眼中的,写的比较详细,比较细致,也比较专业。
&(6),这篇文章似乎是对一个产品的广告,但里面对USS,PSS,RSS 这几个概念有详细的解释
&(7)&,跟(6)一样,是对同一个产品的广告,文章里有一些东西可以参考
(8)&,文章对 free, vmstat,top ,&gnome-system-monitor等命令有一些介绍
(9),对top,free,uptime,pmap,smartctl,iostat,strace等命令有所介绍,并且介绍的比较详细,目前只是粗略的看了一下,有时间还要再看看。&
(10),比较详细的介绍了pmap的应用,不过是基于Solaris 9的
阅读(46624) | 评论(0) | 转发(6) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。博客访问: 29376
博文数量: 30
博客积分: 0
博客等级: 民兵
技术积分: 90
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 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_* 系列函数, 这也我也未深入研究,详见这篇文章()
&6.另外还有一些文章可以参考,如下:
&(1)一个C程序员, 眼中的,写的比较详细,比较细致,也比较专业。
&(6),这篇文章似乎是对一个产品的广告,但里面对USS,PSS,RSS 这几个概念有详细的解释
&(7)&,跟(6)一样,是对同一个产品的广告,文章里有一些东西可以参考
(8)&,文章对 free, vmstat,top ,&gnome-system-monitor等命令有一些介绍
(9),对top,free,uptime,pmap,smartctl,iostat,strace等命令有所介绍,并且介绍的比较详细,目前只是粗略的看了一下,有时间还要再看看。&
(10),比较详细的介绍了pmap的应用,不过是基于Solaris 9的
阅读(185) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 linux 内存占用 的文章

 

随机推荐