曾经在杭州一家公司做技术售后的时候,有一个印象深刻的问题,就是腾讯游戏《剑灵》在 Windows 32 位平台上报错的问题:http://support.icafe8.com/technologynews/hotfault/4708.html。综述原因就是在 32 位平台下虚拟内存地址空间不足(官方给的是这个答复,但真相到底是什么因为当时能力有限没有一探究竟)导致游戏申请不到更多的内存使用而崩溃。那么可以通过 /3GB 的手段去拓展用户空间的虚拟内存地址限制。但 Windows 只有一些参数的开关,我不知道开了以后到底这个进程可用的虚拟内存地址空间还有多少。最近在学习 Windows 内存管理时有人介绍了这款工具 VMMap。
它可以很方便的查看每一个进程的虚拟内存地址空间的状态,实际内部就是调用 VirtualQueryEx 实现的功能。我们来看一下它的截图,首次打开它会让你选择你要查看的进程: 我们打开了一个 32 位的 Chrome.exe 进程,我做了一下简单的标注,把每一个项目所代表的功能标记了一下。其中 Free 就是这个进程可用的虚拟内存地址空间还有多少空余。 上面我们提到《剑灵》的问题,官方除了给出 32 位系统可以通过修改 /3GB 的方式提高用户空间使用虚拟内存地址的大小限制,更建议用户直接更换 64 位系统,那么原因是什么呢?我们用这个工具打开一个 64 位的进程看一下。 从图中我们可以看出,这个 64 位的进程尚有接近 8TB 的虚拟内存地址空间尚未使用,根本不必我们去开什么 /3GB 的开关,所以这就是 64 位 CPU 对内存管理的一种扩充,让 64 位系统中 64 位应用程序可以使用更大的虚拟内存地址空间。