【发布时间】:2022-06-20 18:23:41
【问题描述】:
我有一个在 Windows 10 上运行的 C++ 程序。Windows 任务管理器告诉我提交大小随着时间的推移而迅速增加。而工作集似乎是恒定的。
Screenshot of Task Manager, my program in first line, commit size ~37GB
代码已经被不同的开发者多次检查内存泄漏,我们找不到任何明显的泄漏。
该程序是一个图形和内存密集型应用程序,利用 MFC 实例化多个窗口。我们用 OpenGL 来渲染。由于我们正在处理多个摄像头的图像,因此在运行时会进行大量数据复制。
问题是,大约 10-15 天后,当提交大小耗尽系统的可用总内存(包括分页)(不是物理 RAM)时,要么: a) 程序会崩溃到桌面 b) 显示驱动程序与 GPU 断开连接。迎接我们的只是黑屏。
到目前为止我所尝试的:
- 在代码中查找内存泄漏
- 更新图形驱动程序
- 更新 windows 10
什么样的泄漏只会导致提交大小增加?如何防止此问题发生?
【问题讨论】:
-
操作系统显示的内容并不反映程序实际使用的内存大小。标准库倾向于保持由代码释放的内存(不要将其返回给系统),希望在不久的将来会需要它。向系统请求和返回内存非常昂贵,因此这是一种优化。
-
尝试检查图形资源(画笔、画布...)是否被应用程序释放。在 Windows 中,您必须手动释放它们
-
这是教科书式的内存泄漏。它只会增加提交大小而不是工作内存,因为操作系统可以将其换出。
-
代码已经被不同的开发者多次检查过内存泄漏 怎么样?他们是如何“检查是否有泄漏”的(有办法……)。
-
您和多个开发人员可能没有发现泄漏,但您描述的症状与资源泄漏(内存泄漏或其他一些系统资源如句柄或文件的泄漏)非常一致通常是手动创建但需要手动释放的描述符)。在内存密集型程序中,内存泄漏是一种明显的可能性——但只有一种可能性。在图形密集型程序中,图形资源泄漏(画笔、字体、窗口句柄等)是一种明显的可能性。