【问题标题】:Memory usage and minimizing内存使用和最小化
【发布时间】:2011-04-03 17:58:32
【问题描述】:

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

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

【问题讨论】:

  • 这可能是内存泄漏。看看你是否可以使用IBM PurifyValgrind等软件检测到它。

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


【解决方案1】:

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

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

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

【讨论】:

  • 啊,感谢您的扩展。我希望这不是我们的问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多