现在主流电脑配置的内存都不小,16G属于常规,32g都算不上大,经常会有人疑惑要不要关闭系统的“虚拟内存”,或者去设置为固定值。我就从软件的角度来聊聊。
实际上很多人并不了解虚拟内存到底是干啥的,大部分人接受的常规理解就是“物理内存不够然后用虚拟内存”。实际上这个只是为了方便大众理解的不精确的说法。
首先从比较精确的的角度上来说,磁盘上分配的那个东西不叫 虚拟内存,而是叫分页文件(pagefile),pagefile属于操作系统虚拟内存管理架构,但本身并不叫虚拟内存。
操作系统可以 提交的虚拟内存大小=物理内存+分页文件。注意这里说的是 提交并不是使用。 对于操作系统来说,请求内存、提交内存、使用内存是不同的步骤。
下图电脑装了16G内存,虚拟内存自动管理系统默认分配一倍大小的分页文件。所以整个系统可提交的虚拟内存大小是16+16=32G
<ignore_js_op>
</ignore_js_op>
<ignore_js_op>
</ignore_js_op>
下面使用一个测试程序,申请了128G内存,可以发现就算一台电脑只有16G内存,照样可以申请成功。同时单纯的申请并不会占用任何物理内存
<ignore_js_op>
</ignore_js_op>
内存在使用之前还必须进行所谓的提交操作(COMMIT),提交操作会消耗整个系统的总虚拟内存数值(上限=16+16=32G),下面一个测试程序提交25G的内存,这个示例中系统的总虚拟内存已经消耗了30G,但实际上程序几乎没有使用任何物理内存(0.4M),在windows下只对内存进行读写才会产生实际的物理内存消耗
假如下图中系统的分页文件已经达到设置的最大值(或者固定值),实际上整个系统还能使用的内存并不是15.9g-3.4g=12.5g的物理内存,而仅仅只有32.9-29.3=3.6g的内存可以用了,任何程序提交或使用超过3.6g,不管你物理内存还剩下多少,系统都将提示内存不足
<ignore_js_op>
</ignore_js_op>
<ignore_js_op>
</ignore_js_op>
操作系统提示内存不够的时候,实际上并不是物理内存饱和,而是虚拟内存上限(物理内存+分页文件)饱和了,就算物理内存实际还有很大的剩余,在一些情况下照样会造成系统内存不够。
部分游戏,比如古墓丽影10,就会发现这个游戏会提交相当多的内存(实际物理内存还没使用到),假如关闭分页文件或者设置了比较小的值,将导致可申请的虚拟内存上限降低,虽然16G内存足够玩这个游戏,但是还是会出现系统提示内存不够的情况。
所以,分页文件大小并不只是用来放入物理内存放不下的数据,还会影响整个系统的理论内存使用上限。一般来说还是建议让操作系统自己管理。
而且有些人会有一个习惯,把分页文件的最大最小值设置成一样,这是一个流传十几年的设置方式。在HDD的时代,在操作系统刚装好的时候,磁盘分区相对比较空闲,给分页文件固定大小的好处是可以预先分配一个比较连续的磁盘空间,避免碎片影响性能。但是现在已经是SSD的年代了,并不存在碎片问题,所以那些还保留着设置分页固定大小的老鸟们也可以改掉这个习惯了