4 GB 优化:BCDEdit 和 Boot.ini

在 Windows 的 32 位版本中,应用程序的可用虚拟地址空间为 4 GB。 分配此虚拟地址空间,让应用程序使用 2 GB 空间,另外 2 GB 仅限系统使用。 使用 BCDEdit /set increaseuserva 命令启用的 4 GB 优化 (4GT 或 4GT RAM 优化) 功能,可将应用程序可用的虚拟地址空间增加到 3 GB,并将系统可用的容量减少到 1 到 2 GB 之间。

对于内存密集型应用程序(例如数据库管理系统 (DBMS) ),使用更大的虚拟地址空间可提供相当大的性能和可伸缩性优势。 但是,文件缓存、分页池和非分页池较小,这可能会对网络或 I/O 繁重的应用程序产生不利影响。 因此,你可能希望在负载下测试应用程序,并检查性能计数器以确定应用程序是否受益于更大的地址空间。

若要启用 4GT,请使用 BCDEdit /set 命令将 increaseuserva boot entry 选项设置为介于 2048 (2 GB) 和 3072 (3 GB) 之间的值。

Windows Server 2003 及更早版本: 若要启用 4GT,请将 /3GB 开关添加到 Boot.ini 文件。 以下系统支持 /3GB 开关:

  • Windows Server 2003
  • Windows XP Professional

/3GB 开关使应用程序可以使用完整的 3 GB 虚拟地址空间,并将系统可用的空间量减少到 1 GB。 在 Windows Server 2003 上,可以通过将 Boot.ini 中的 /USERVA 开关设置为介于 2048 和 3072 之间的值来调整应用程序可用的地址空间量,从而增加系统可用的地址空间量。 当应用程序需要超过 2 GB 但少于 3 GB 的地址空间时,这有助于保持系统的整体性能。

若要使应用程序能够使用更大的地址空间,请在映像标头中设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志。 Microsoft Visual C++附带的链接器支持 /LARGEADDRESSAWARE 开关来设置此标志。 设置此标志,然后在没有 4GT 支持的系统上运行应用程序不应影响应用程序。

在 64 位版本的 Windows 上,标有 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志的 32 位应用程序具有 4 GB 的可用地址空间。

Windows Server 2003 的 Itanium 版本: 在 SP1 之前,32 位进程只有 2 GB 的可用地址空间。

使用以下准则在应用程序中支持 4GT:

  • 靠近 2 GB 边界的地址通常由各种系统 DLL 使用。 因此,即使整个 4 GB 地址空间可用,32 位进程也无法分配超过 2 GB 的连续内存。
  • 若要检索用户虚拟空间总量,请使用 GlobalMemoryStatusEx 函数。 若要检索可能的最高用户地址,请使用 GetSystemInfo 函数。 始终在运行时检测实际值,并避免使用硬连线常量定义,例如: #define HIGHEST_USER_ADDRESS 0xC0000000
  • 避免使用指针进行有符号比较,因为它们可能会导致应用程序在启用 4GT 的系统上崩溃。 对于高于 2 GB 的指针,如下所示的条件为 false: if (pointer > 40000000)
  • 启用 4GT 后,将指针的最高位用于应用程序定义的目的的代码将失败。 例如,如果某个 32 位单词低于 0x80000000,则可能被视为用户模式地址,如果高于,则被视为错误代码。 对于 4GT,情况并非如此。

VirtualAlloc 通常先返回低地址,然后再返回高地址。 因此,除非进程分配大量内存或具有零碎的虚拟地址空间,否则进程可能不会使用非常高的地址。 若要在调用 VirtualAlloc 时强制从较高地址之前从较低地址分配分配,请在调用 VirtualAlloc 时指定MEM_TOP_DOWN,或将以下注册表值设置为0x100000:

\ HKEY_LOCAL_MACHINE系统\CurrentControlSet\控制\会话管理器\内存管理\AllocationPreference

Windows 版本的内存限制

物理地址扩展

4GT 技术参考