OpenGL GLFW 应用程序 - 客户端内存限制

OpenGL GLFW application - client side memory limit

我在 Windows 10 x64 上工作。 32 位进程最多可以使用 2GB 内存。我已经测试过了:一个只分配 25mb 内存块的简单程序可以使用 ~1950mb 的内存。超过该大小后,malloc returns null。我使用 GLFW 库创建了一个简单的 OpenGL 应用程序。它只显示一个空 window - 任务管理器显示内存使用量约为 26 MB。我注意到当我在调用以下函数后尝试执行 malloc 测试时:

glfwSetErrorCallback(error_callback);

if (!glfwInit())
{
    exit(EXIT_FAILURE);
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);

GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, "LegacyGL", NULL, NULL);

if (!window)
{
    glfwTerminate();
    exit(EXIT_FAILURE);
}

glfwSetKeyCallback(window, key_callback);
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
当应用程序内存使用量约为 1600mb 时,

malloc return null。我还没有分析 GLFW 源代码,但怎么可能呢?在执行 malloc 测试之前,内存使用量约为 24mb。任务管理器是否可能没有显示程序已使用的所有内存。

编辑:

减少 malloc 大小后,程序可以分配大约 1800mb。看起来 opengl 驱动程序映射了程序的某些内存区域,但任务管理器没有显示它。你知道有什么工具可以检查驱动程序映射了多少内存吗?哪些 OpenGL 函数增加了这样的映射内存区域?

32 位程序的 2GB 限制是 地址 space。这是您可以拥有的内存地址数量的限制

任务管理器显示实际使用的内存

有可能——而且相当普遍——用完了地址,但实际上并没有用完内存。例如,驱动程序可能会为一大块显卡内存分配地址,即使它尚未使用任何内存。


或者,可能是分配了内存,但不是任务管理器显示的类型。我不确定 "Processes" 选项卡中显示的是哪种类型的内存,但是如果您转到 "Details" 选项卡,您应该会看到该列实际上称为 "Memory (active private working set)"。如果将鼠标移到它上面,工具提示会显示“该进程使用的物理内存量不能被其他进程使用。

这比您最初想象的更具体:

  • 如果内存与任何其他进程共享,则不计算在内。
  • 如果内存当前在磁盘上(而不是在物理 RAM 中),则不计算在内。
  • 如果内存已分配但尚未访问,则不计算在内。在这种情况下,它不在物理 RAM 中,但也不在磁盘上,因为 OS 知道存储空白内存没有意义。

总而言之,出现这种差异的原因有很多。如果您需要使用大量内存,请将您的程序编译为 64 位。