【发布时间】:2020-03-30 08:53:13
【问题描述】:
我在 Windows 10 x64 上工作。 32 位进程最多可使用 2GB 内存。我已经测试过了:一个只分配 25mb 内存块的简单程序可以使用约 1950mb 的内存。超过该大小后,malloc 返回 null。我使用 GLFW 库创建了一个简单的 OpenGL 应用程序。它只显示一个空窗口 - 任务管理器显示内存使用量约为 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 返回 null。我还没有分析 GLFW 源代码,但它怎么可能?在执行 malloc 测试之前,内存使用量约为 24mb。任务管理器是否可能没有显示程序已使用的所有内存。
编辑:
减少 malloc 大小后,程序能够分配大约 1800mb。看起来 opengl 驱动程序映射了程序的一些内存区域,但任务管理器没有显示它。你知道有什么工具可以检查驱动程序映射了多少内存吗?哪些 OpenGL 函数会增加这种映射的内存区域?
【问题讨论】:
-
这是可能的,因为地址空间碎片(没有连续的 24mb 块)。当
malloc返回 null 时,继续重试分配,块大小不断减小,直到您获得成功的分配 - 重复。有一个合理的下限,比如 4K(或平台页面大小)。 -
所以看起来 GLFW lib 会导致如此严重的内存碎片。
-
不确定;所以只是评论。上面的测试编写起来并不难,所以你可以自己证明(或反驳)它。
-
另一个罪魁祸首可能是视频驱动程序的 OpenGL 实现。通常它需要映射一些内存区域来与硬件通信。
-
@Botje 请参阅编辑
标签: c++ c opengl memory-management glfw