虚拟内存和物理内存
物理内存是真正的内存,在应用中顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。看机器配置的时候,看的就是这个物理内存。
虚拟内存是为了满足系统对超出物理内存容量的需求时在外存(如硬盘)上开辟的存储空间。由于虚拟内存其实是放在外存上,因而与物理内存相比读写速度都非常慢。
我们知道,32位CPU,有32根地址线,那么它的寻址空间就是4GB。也就是说,如果没有其它的限制,我们的主板上最大可以安装4GB的物理内存。
虚拟内存的作用与物理内存基本相似,但它是作为物理内存的“后备力量”而存在的,只有在物理内存已经不够使用的时候,它才会发挥作用。操作系统用虚拟内存来动态管理运行时的交换文件。为了提供比实际物理内存还多的内存容量以供使用,系统占用了硬盘上的一部分空间作为虚拟内存。当CPU有要求时,首先会读取内存中的资料。当内存容量不够用时,系统就会将需要暂时储存的数据写入硬盘。所以,计算机的内存大小等于实际物理内存容量加上“分页文件”(就是交换文件)的大小。如果需要的话,“分页文件”会动用硬盘上所有可以使用的空间。我们可以发现,在Windows 2000/XP目录下有一个名为 pagefile.sys的系统文件,Windows 98下为Win386.swp(如下图所示),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,而且当我们把它删除时,在下次进入电脑又自动产生了。其实,pagefile.sys是Windows下的一个虚拟内存文件。
监控工具--vmstat
root@ubuntu:~# vmstat2
procs-----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。
参数的意义:
具体见:http://blog.csdn.net/lwnylslwnyls/article/details/8959263
监控工具---pmap
pmap - report memorymapof a process(查看进程的内存映像信息)
循环显示进程3066的设备格式的最后1行,间隔2秒
[root@C44 ~]# while true; do pmap -d 3066 | tail -1; sleep 2; done
mapped: 5412K writeable/private: 2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private: 2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K
mapped: 5412K writeable/private:2028K shared: 0K最后一行的值
mapped表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
shared表示进程和其他进程共享的内存大小
具体见:
http://blog.csdn.net/lwnylslwnyls/article/details/8959314
内存查看工具---free
一般情况下通过如下命令查看内存的使用情况
$ free -m详细的解释见如下链接:
http://blog.csdn.net/lwnylslwnyls/article/details/8959213
其他方式
top /proc/meminfo /proc/<pid>/statm
/proc/<pid>/status /proc/<pid>/maps
内存泄漏测试方法:
目前测试内存泄漏并没有发现好的办法,主要通过观察程序占用的内存有无明显的上升,一般来说上升了应该存在一定的内存泄漏,但是如果内存没有上升是否意味一定没有内存泄漏呢,答案是否定的。程序员可以通过一些手段来掩盖内存泄漏的事实。举两个简单的例子:
1,设置程序的最大工作集来调整内存占用。
2,定期将物理内存的占用转移到虚拟内存。
这样尽管物理内存并没有显著的上升,但仍然有可能存在内存泄漏。
因此在发现程序有可能存在内存泄漏的时候,不光要看物理内存的变化,同时也要关注到虚拟内存的变化。
内存泄漏原因:
1.常见的如malloc,new,realloc空间后,未释放。
2.c++中使用了虚指针,在调用析构函数时漏掉了子类的析构。
内存泄漏常见问题:
Q:用top命令查看一个进程,虚拟内存一直不变,但物理内存每时5s增长12k或20k.
虚拟内存不长通常就没有内存泄漏。物理内存增长通常是你的活跃数据/代码越来越多,所以都慢慢被调进无力内存了,不是很大的问题,具体的分析要看你的程序是什么性质。
举个简单的例子,上来就分配了一个大数组,然后随着程序的运行往其中增加不重复值,这样每次增加的时候你都会读取/移动部分数组。在这种情况下,虚拟内存是不会变的(没有申请更多空间),但是物理内存会越来越大,因为你访问的数据越来越多。
遇到过的一个问题就是:vector动态分配内存的问题,vector刚开始申请的空间如果不够了,它会自动分配1块2倍的内存,但当数据稳定了,不再出现新的不重复的数据时,它也就不会再分配了。内存监控上表现为内存成阶梯增长,增长到一定阶段平稳,不再增长。
我当时用了不下十种内存定位的方法,后来找平台人(我们产品是跑在公司的平台上的,这个平台是将OS的差异分装了一下)问了下,他们说当前他们的内存分配算法就是那样,内存增长是一个半椭圆的曲线,达到峰值后会下降,最终平稳。
1025

被折叠的 条评论
为什么被折叠?



