物理内存和虚拟内存

虚拟内存和物理内存

物理内存是真正的内存,在应用中顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。看机器配置的时候,看的就是这个物理内存。

虚拟内存是为了满足系统对超出物理内存容量的需求时在外存(如硬盘)上开辟的存储空间。由于虚拟内存其实是放在外存上,因而与物理内存相比读写速度都非常慢。 

我们知道,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的差异分装了一下)问了下,他们说当前他们的内存分配算法就是那样,内存增长是一个半椭圆的曲线,达到峰值后会下降,最终平稳。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值