内存使用和最小化

时间:2010-08-25 13:49:42

标签: c++ memory graphics memory-leaks openscenegraph

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

当用户启动另一个需要大量RAM的程序时,此数字也会自动关闭。 Windows会删除您的页面以便为此程序腾出空间。它选择你的程序暂时没有使用的页面,这可能不会影响程序的性能。

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

毋庸置疑,这个数字与你的程序的内存使用完全无关,它只是一个统计数字。

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

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