虚拟内存

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

目录

简介
作用
虚拟内存不足的原因
运行原理及过程
设置
使用技巧

简介

  如果计算机缺少运行程序或操作系统所需的随机存取内存 (RAM,又称物理内存),则 Windows 使用虚拟内存(Virtual Memory)进行补偿。

  虚拟内存将计算机的物理内存和硬盘上的临时空间组合在一起。当物理内存不足时,Windows 的虚拟内存管理器将数据从物理内存移动到称为“分页文件”(又称交换文件)的空间中。将数据移入与移出分页文件可以释放物理内存,以便完成工作。

  一般而言,计算机的物理内存越多,程序运行得越快。如果计算机的速度由于缺少物理内存而降低,则可以尝试增加虚拟内存来进行补偿。但是,计算机从物理内存读取数据的速度要比从硬盘读取数据的速度快得多,因此增加物理内存是更好的方法。

  (本文有诸多网友的贡献。在此基础上,本人作了一些删改。删改的目的是为了达到技术上的准确,清理重复的内容,同时保持可理解性。)

图:虚拟内存的设置

作用

  不知大家有没有发现,在 Windows NT/2000/XP 目录下有一个名为 pagefile.sys 的系统文件(Windows 95/98 下为 Win386.swp),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,这种毫无规律的变化实在让很多人摸不着头脑。其实,pagefile.sys 是 Windows 下的一个虚拟内存,它的作用与物理内存基本相似,但它是作为物理内存的“后备力量”而存在的,但是,它并不是在只有物理内存不够用时才发挥作用的,也就是说在物理内存够用时也有可能使用虚拟内存,如果你虚拟内存设置过小则会提示“虚拟内存不足”。

虚拟内存不足的原因

1、感染病毒

  有些病毒发作时会占用大量内存空间,导致系统出现内存不足的问题。赶快去杀毒,升级病毒库,然后把防毒措施做好!

2、虚拟内存设置不当

  虚拟内存设置不当也可能导致出现内存不足问题,一般情况下,虚拟内存大小为物理内存大小的 1.5 倍到 2.5 倍即可,如果设置得过小,就会影响系统程序的正常运行。重新调整虚拟内存大小:以 Windows XP 为例,右键点击“我的电脑”,选择“属性”,然后在“高级”标签页,点击“性能”框中的“设置”按钮,切换到“高级”标签页,然后在“虚拟内存”框中点击“更改”按钮,接着重新设置虚拟内存大小,完成后重新启动系统就好了。如果还是经常遇到虚拟内存过小的警告,可以略微设置得更大些,比如 2 到 3 倍,但是太大的虚拟内存会占用额外的磁盘空间,因此只有当经常看到虚拟内存不足的警告时才需要设大。

3、系统盘(C盘)空间不足

  虚拟内存文件默认是在系统盘中,如 Win XP 的虚拟内存文件名为“pagefile.sys”,如果系统盘剩余空间过小,导致虚拟内存不足,也会出现内存不足的问题。系统盘至少要保留 300MB 剩余空间,当然这个数值要根据用户的实际需要而定。用户尽量不要把各种应用软件安装在系统盘中,保证有足够的空间供虚拟内存文件使用,而且当系统盘空间紧张时,把虚拟内存文件安放到非系统盘中。

4、因为 SYSTEM 用户权限设置不当

  基于 NT 内核的 Windows 系统启动时,SYSTEM 用户(一个系统帐户,比管理员权限更高)会为系统创建虚拟内存文件。有些用户为了系统的安全,采用 NTFS 文件系统,但却取消了 SYSTEM 用户在系统盘“写入”和“修改”的权限,这样就无法为系统创建虚拟内存文件,运行大型程序时,也会出现内存不足的问题。问题很好解决,只要重新赋予 SYSTEM 用户“写入”和“修改”的权限即可,不过这个仅限于使用 NTFS 文件系统的用户。

运行原理及过程

  可能大家都会知道虚拟内存就是当物理内存不足够的时候,把硬盘的一部分当作内存来使用。

  这样理解其实不够准确。

  首先要知道:打开任何一个程序,都是要占用物理内存的,当关闭这个程序的时候,系统也将会从物理内存中删除这个程序的信息。物理内存就是大家平时经常说的 1G 内存、512M 内存。

  接着分两方面理解虚拟内存。

  假设计算机物理内存是 512M,系统都安装在C盘。

  (一)当物理内存足够的时候

  假设,我们运行的程序占用了 215M,此时物理内存绝对够用了,但是不要以为此时系统没有用虚拟内存技术,系统照样用了虚拟内存技术,当我们打开 QQ 的时候,系统就为 QQ 这个程序指定了一个 2G 的虚拟映射空间,只是此时这个虚拟空间里面只有 215MB 信息而已,而且全部放在物理内存中。

  (二)当物理内存不足的时候

  假设计算机运行“迅雷”和“IE 浏览器”这两个个软件的时候需要内存已经达到512M(实际上是不可能用完所有的物理内存的,只能接近,因为系统本身需要内存),我们启动 QQ,如果没有虚拟内存技术,我们此时根本不能启动 QQ,因为 QQ 不能在内存中写入相关信息。不过现在有了虚拟内存技术,此时系统将会释放一部分物理内存给 QQ 用,因为迅雷和 IE 的内存都是虚拟映射的,所以被分为许多个小块(内存页),系统会选择一部分 IE 或者迅雷的内存块释放给 QQ 用。假设释放的是迅雷所占用的物理内存,那么迅雷所占用的物理内存信息将会保存到硬盘上的一个 pagefile.sys 的文件中。

  当我们想再运行迅雷的时候,此时系统会从 pagefile.sys 查找相应的迅雷信息,同时把这些信息重新载入到物理内存里面,并且把 QQ 的信息释放到 pagefiles.sys 里面。

  这样一个循环交换过程就是虚拟内存技术,为什么叫它虚拟呢,因为系统把文件释放到了硬盘上,而这个硬盘可不是内存,只是临时的保存内存信息的地方。

  一句话,虚拟内存就是用如硬盘u盘等不是内存的介质来存储内存的信息。

  Windows XP系统里面的 C:\Windows\Prefetch 这个文件夹里面的文件是虚拟内存技术的扩展,这些 prefetch(预读)文件可以提升程序启动时的速度。

  当我们运行程序时候,系统会依据内存记录这个程序经常用到的文件,并且把这个程序读取信息记录下来,同时在 C:\Windows\Prefech 下创建一个后缀是 .pf 的文件,并且把读取的信息保存到这 .pf 文件里面,这样下次启动时可以直接读取 pf 文件,而不必读取多个小文件,使启动速度加快。

  假设我们运行已经被记录的 PhotoShop 这个程序,那么你双击桌面上的 PhotoShop 的时候,系统会先从 C:\Windows\Prefetch 中查找这个 PhotoShop 的相关记录,提前把相关文件载入到内存的磁盘缓存中,这样,如果 PhotoShop 像预期的那样读取这些文件或加载这些 dll,速度就能加快很多。

  C:\Windows\Prefetch 里面还有一个 Layout.ini 这个文件,这个文件的作用就是排列文件载入的次序,如果 C:\Windows\Prefetch 里面的预读文件很多,那么你每次运行一个程序的时候,系统都要花时间去搜索这个程序有没有预读文件,但是系统的搜索算法是优化过的,通常不会导致程序启动很慢。

  Windows Vista 的 Superfetch 功能比 XP 的 prefetch 更进一步,它不仅优化程序启动时的速度,还优化了程序运行时的速度。它根据程序虚拟内存页被使用的频率划分优先级,然后把高优先级的内存页尽量保存在内存中。如果物理内存不够用,高优先级的内存块被交换到磁盘上后,只要物理内存再度空闲,系统会自动把高优先级内存页放回物理内存中。

  右图显示了如何查看单个应用程序的虚拟内存大小。其中的虚拟内存大小比“内存使用”(物理内存占用量)可能还要小。这种情况比较特殊,通常是因为程序的共享内存空间(比如 dll 的机器码以及共享的内存映射文件)比较大的关系。一般来说,“内存使用”比较客观地反映了一个程序的当前物理内存占用情况。“虚拟内存大小”则反映了一个程序总共有多少数据放在内存中,其中一部分暂时不用的数据可能放在交换文件 pagefile.sys 中了。

图:查看虚拟内存的大小

设置

合理设置虚拟内存

一、如何确定虚拟内存大小

1.新手篇

  新手有两个选择:

  1. 由系统或系统优化软件分配。

  2. 设置为物理内存的 1.5~2 倍。

2.老手篇

  事实上,严格按照 1.5~2 倍的倍数关系来设置并不科学,因此我们可以根据系统的实际应用情况进行设置。在这过程中需要用到 Windows 2000/XP/2003 自带的性能监视器。

  1. 运行“perfmon.msc”打开性能监视器,展开左侧的性能日志和警报,并点击选择记数器日志,在右侧的面板中空白处点击鼠标右键,选择新建日志设置,并命名为 Pagefile,然后回车确认。

  2. 在常规选项卡下,点击添加记数器按钮,在新弹出的窗口的性能对象下拉菜单中选择 Paging File,并选择“从列表选择记数器”,然后点击 % Usage Peak,在范例中选择“_Total”,并接着点击“添加”按钮。

  3. 然后关闭这个窗口,并点击图三中的“确定”按钮。点击“是”创建日志文件。接着打开“日志文件”选项卡,在日志文件类型下拉菜单中选则“文本文件(逗号分隔)”,然后记住“例如”框中显示的日志文件的路径。

  4. 这样,点击确定后这个记数器已经开始运行了,你可以在电脑上进行你的日常操作,并尽可能多的打开和关闭各种经常使用的应用程序和游戏。经过几个小时的使用,基本上记数器已经可以对你的使用情况做出一个完整的评估。

  5. 这时你需要先停止这个记数器的运行,同样是在记数器日志窗口中,选中我们新建的 Paging File 记数器,然后右键点击,并且选择停止。用记事本打开日志文件。

  6. 需要注意的是,在日志中的数值并不是分页文件的使用量,而是使用率。也就是说,根据日志文件的显示,该系统一般情况下的分页文件只使用了 25% 左右,而系统当前设置的分页文件足有 2GB,那么为了节省硬盘空间,完全可以把分页文件最小值缩小为 512MB大小。而对于最大值,可以设为最小值加上物理内存的一半大小。

图:用任务管理器监控虚拟内存使用情况

二、虚拟内存的位置

  在设置虚拟内存的时候还需要注意,如果你有超过一块硬盘,那么最好能把分页文件设置在没有安装操作系统或应用程序的硬盘上,或者所有硬盘中速度最快的硬盘上。这样在系统繁忙的时候才不会产生同一个硬盘既忙于读取应用程序的数据又同时进行分页操作的情况。相反,如果应用程序和分页文件在不同的硬盘上,这样才能最大程度降低硬盘利用率,同时提高效率。当然,如果你只有一个硬盘,就完全没必要将分页文件设置在其他分区了,同一个硬盘上不管设置在哪个分区中,对性能的影响都不是很大。

三、虚拟内存页面文件与磁盘碎片

  由于虚拟内存使用了硬盘,硬盘上非连续写入的文件会产生磁盘碎片,因此一旦用于实现虚拟内存的文件或分区过于零碎,会加长硬盘的寻道时间,影响系统性能。有观点误认为 Windows 系统频繁读写 pagefile.sys 就会产生磁盘碎片,实则不然。因为 pagefile.sys 文件一旦创立,在分区中的分布连续形式就固定下来,文件内部读写并不增加或减少 pagefile.sys 的文件大小。仅当页面文件告罄后系统创建的 temppf.sys 会带来磁盘碎片。而在 Linux 系统中,将用于虚拟内存的部分置于单独的分区中,不影响其他的分区或文件,则基本杜绝了磁盘碎片带来的影响。

四、虚拟内存的设置方法

  一般 Windows XP 默认情况下是利用 C 盘的剩余空间来做虚拟内存的,因此,C 盘的剩余空间越大,对系统运行就越好。当 C 盘空间紧张时,可以将虚拟内存文件设在其他盘。查看虚拟内存设置情况如下:

  右键点“我的电脑”,左键点“属性”,点选“高级”选项卡,点“性能”里的“设置”按钮,再选“高级”选项卡,点下面的“更改”按钮,所弹出的窗口就是虚拟内存设置窗口,一般默认的虚拟内存是从小到大的一段取值范围,这是虚拟内存变化大小的范围。系统已启动时,会分配最小值所指定的空间。当虚拟内存不够时,系统会显示“虚拟内存不足”警告对话框,同时分配更多的虚拟内存,直到最大值所指定的范围。由于虚拟内存不足后需要花费更多的时间分配新空间,因此最好给它一个比较大的最小值,同时也不容易产生磁盘碎片了。具体数值根据你的物理内存大小来定,一般为物理内存的 1.5 到 2 倍,如内存为 256M,那么应该设置 256 * 1.5 = 384M,或者干脆 512M,设置方法如下:

  假设内存为 256M,虚拟内存放在 D 盘,先要将默认的清除,保持 C 盘为选中状态,单选“无分页文件(N)”再按“设置”按钮,此时 C 盘旁的虚拟内存就消失了,然后选中 D 盘,单选“自定义大小”,在下面的“初始大小”和“最大值”两个方框里都添上 512,再点一下“设置”按钮,会看到 D 盘的旁边出现了“512-512”的字样,这样就说明设置好了,再一路确定,最终,系统会要重新启动,重启一下,便完成了设置。

图:虚拟内存的设置(2)

使用技巧

a. 调整 Windows 9x 中分页文件的位置

Windows 9x 的虚拟内存分页位置,默认在 C:\WINDOWS\WIN386.SWP。如果要放到其他盘,也可以通过“系统属性”进行设置。

b. 注意事项

  允许设置的虚拟内存最小值为 2MB,最大值不能超过当前硬盘的剩余空间值,同时也不能超过 32 位操作系统的内存寻址范围——4GB。对于 64 位系统如 Windows Vista/Windows 7 x64,目前的上限很大,基本可以不用担心。有趣的是,企业版 Windows 2003 服务器虽然是 32 位的,但是可以设置 64GB 虚拟内存。另外,对于 32 位系统,无论虚拟内存是否用完,单个程序(进程)的虚拟内存空间一般情况下不可能超过 2GB,因此某些软件如 Flash 在加载大量高分辨率图片的时候可能会因为它的 2GB 虚拟内存用完而崩溃。一种解决办法是把图片分辨率降低。

c. 禁止操作系统本身被放到虚拟内存中

  只有在物理内存足够时(通常建议对于 XP 是 512MB,Vista 是 2GB 以上),使用此设置才能略微提升系统性能。方法是:依次进入注册表编辑器“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management”下,在 “DisablePagingExecutive”(禁止对系统执行部分的换页)选项中将其值设为“1”即可。

  PS:此举可能会造成系统不稳定,某些程序无法运行或死机。请根据自己实际情况更改。

d. 禁用虚拟内存

  1G 以上内存就比较够用了,玩游戏、使用大型软件不推荐禁用虚拟内存。当然如果内存有 2G 的时候,可以根据自己的实际情况选择虚拟内存的使用大小(我个人认为 2G 内存可以禁用虚拟内存以提升系统性能,但 Vista/Win 7 系统内存使用比较大,可以根据实际情况设定)。

e. 清空页面文件

  在前述注册表“Memory Management”键里面有一个“ClearPageFileAtShutdown(关机时清除页面文件)”,将该值设为“1”。这里所说的“清除”页面文件并非是指从硬盘上完全删除 pagefile.sys 文件,而是对其进行“清洗”和整理,根据微软的说法,这是一个安全选项,与性能无关。

f. 高级话题:使用 SweepRAM 工具

  适用于 Windows 2000/XP/2003。网上可以找到 SweepRAM 程序。该程序最大的作用是把所有进程的工作集清空。所谓工作集是指进程已映射的物理内存部分(即这些内存块全在物理内存中,并且 CPU 可以直接访问),还有一部分不在工作集中的虚拟内存则可能在转换列表中(CPU 不能通过虚地址访问,需要 Windows 映射之后才能访问),还有一部分则在磁盘上的页面文件里。工作集在进程运行时会被 Windows 自动调整,频繁访问的页面(4KB 的块)会留在内存中,而不频繁访问的页面在内存紧张时会被从工作集中移出,暂时保存在内存中的“转换列表”中,或者进一步换出到页面文件中。当应用程序再次访问某一页面时,操作系统会将它重新加回工作集中。

  SweepRAM 工具以一种适中的频率(大约 40 分钟一次)反复运行,可以将各进程的工作集清空,而之后各进程的工作集会慢慢恢复。这样可以保持更好的工作集平衡,从而提高系统性能。

g. 如果要使用调试转储文件

  调试转储文件(Memory.dmp)用于系统蓝屏死机之后,发送给微软或给专业人士调试,从而发现蓝屏的原因所使用。由于转储时先要把所有物理内存的内容写到系统盘的页面文件,因此其大小必须大于等于物理内存大小。具体设置方法如下:打开“我的电脑”的“属性”设置窗口,切换到“高级”选项卡,在“启动和故障恢复”窗口的“写入调试信息”栏,如果你采用的是“无”,则可将系统盘的页面文件大小可以设置为最小 2MB 左右,如果采用“核心内存存储”和“完全内存存储”,则将系统盘的页面文件值设置得大一些,大于等于物理内存大小。其他盘的页面文件大小对于转储是无关紧要的。

h. 有关虚拟内存对硬盘寿命的影响

  首先,程序开得多了以后,虚拟内存的使用率上升,对于硬盘寿命肯定是有影响的。但是,我们基本上不必太过关心这种影响。为什么呢?因为硬盘的寿命很长,即使一直不停地读写,也能用上 10 年以上,到时候电脑都早已更新换代了吧。现代的硬盘磁头无论读写,都是不接触盘面的。另外,只要插电,它就一直高速旋转。看似很伤,但是好的硬盘有着优质的轴承和马达,精密的盘片和磁头,寿命是相当长的。保险起见,最好用移动硬盘每星期做一下重要数据的备份,毕竟万一数据掉了损失很大。

返回“我的程序”页面