3

我们有一个使用 FOX 工具包和 OpenSceneGraph,当然还有 C++ 的图形密集型应用程序。我注意到在运行应用程序一段时间后,似乎存在内存泄漏。但是,当我最小化时,似乎释放了大量内存(如 Windows 任务管理器中所见)。当应用程序恢复时,内存使用量会攀升,但会稳定到小于最小化之前的水平。

这是一个巨大的指标,表明我们有严重的内存泄漏吗?或者这可能与 Windows 如何处理图形应用程序有关?我不确定发生了什么。

4

3 回答 3

5

您所看到的只是内存缓存。当您调用 free()/delete()/delete 时,大多数实现实际上不会将此内存返回给操作系统。他们会在您下次请求时以更快的方式将其退回。当您的应用程序最小化时,他们将释放此内存,因为您不会很快请求它。

您不太可能有实际的内存泄漏。任务管理器不是特别准确,并且有很多行为可以改变您正在使用的明显内存量 - 即使您正确释放它。如果您仍然担心,您需要获得一个实际的内存分析器来查看。

另外,是的,Windows 在最小化应用程序时做了很多事情。例如,如果您使用 Direct3D,则会出现设备丢失。有线程计时的东西。Windows 旨在为用户一次在单个应用程序中提供最佳体验,并且可能会从您的应用程序中获取额外的缓存/缓冲资源来执行此操作。

于 2010-08-25T14:01:50.443 回答
1

不,您看到的效果意味着您的平台在不可见时释放资源(好事),这似乎清除了一些缓存数据,这些数据在恢复窗口后不会恢复。

这样做可以帮助您发现内存泄漏。如果应用程序使用的最小内存量(最小化)随着时间的推移而增长,则表明存在泄漏。

于 2010-08-25T13:55:41.907 回答
1

您正在查看程序的工作集大小。实际在 RAM 中的程序的虚拟内存页的总和。当您最小化您的主窗口时,Windows 会假定用户暂时不会对该程序感兴趣并积极修剪工作集。将 RAM 中的页面复制到页面文件并将它们丢弃,为用户可能启动或切换到的其他进程腾出空间。

当用户启动另一个需要大量 RAM 的程序时,这个数字也会自动下降。Windows 会丢弃您的页面,以便为该程序腾出空间。它会选择您的程序一段时间未使用的页面,这可能不会对您的程序的性能产生太大影响。

当您切换回您的程序时,Windows 需要将页面交换回 RAM。但这是按需提供的,它只是您的程序实际使用的页面页面。这通常会比以前使用的要少,例如,不需要交换程序的初始化代码。

不用说,这个数字与你程序的内存使用情况完全没有关系,它只是一个统计数字。

私有字节将是内存泄漏的更好指标。Taskmgr 没有显示,SysInternals 的 ProcMon 工具显示。它仍然不是一个很好的指标,因为该数字还包括堆中由您的程序释放并添加到空闲块列表中的任何块,准备被重新使用。没有很好的方法来测量实际使用的内存,请阅读 HeapWalk() API 函数的小字,了解导致的那种问题。

Windows 中的内存和堆管理器过于复杂,无法从可用数字中得出结论。使用泄漏检测工具,例如 VC 调试分配器 (crtdbg.h)。

于 2010-08-25T15:33:09.560 回答