【问题标题】:Why does my application use more memory on Windows 10?为什么我的应用程序在 Windows 10 上使用更多内存?
【发布时间】:2020-04-01 13:32:14
【问题描述】:

我有一个使用 Visual Studio 2010 编译的 C++ 应用程序。这是一个大型遗留应用程序,具有多个线程服务于套接字、数据库连接、RV 市场数据流等。

在 Windows 7 上,该应用程序运行良好,正常使用时消耗大约 700MB 内存,一旦启动并运行,波动很小。

复制到我的 Windows 10 机器上的完全相同的二进制文件在启动后大约 15 秒内耗尽内存。

我使用 SysInternals procexp64.exe 来监控内存使用情况。在 Win7 机器上,我看到虚拟内存使用量徘徊在 700MB 左右。在 Win10 机器上,虚拟内存使用率稳步攀升,直到在启动几秒钟内达到 2GB 标记,然后抛出内存不足异常。我在链接器设置中设置了 LargeAddressAware 标志,然后它的行为方式相同,当它达到 4GB 时抛出内存不足异常。

Win7 和 Win10 平台之间的内存分配有何不同可以解释这个问题?

【问题讨论】:

  • 这可能是代码中某处未定义的行为。没有minimal reproducible example 就很难或不可能提供帮助
  • 也许您的程序中总是存在错误,现在将应用程序移动到不同的操作系统会暴露该错误。无论是那个,还是你的代码隐式或显式地依赖于操作系统的某些“默认”行为,而在 Win 10 上,这种假设不再适用。
  • 我怀疑你们俩都是对的。该程序可能充斥着多年未被注意到的未定义行为和错误。
  • 在您的代码中可能未初始化的变量在 Windows 7 下运行时似乎总是“工作”。还要确保您检查了所有 Windows API 调用(如果您的应用进行此类调用)以确保他们返回该功能已成功完成。很多时候,不检查这些错误的代码只是假设函数可以工作,但是当程序必须在不同的操作系统(甚至不同的机器)上运行时,调用会返回一个未被检测到的错误。因此,假设一切正常,它会将您的程序放入代码的那部分。

标签: c++ windows-10 windows-7-x64


【解决方案1】:

我设法找到了此应用程序在我的 Windows 10 工作站上内存不足的原因。

是的,该应用程序是未定义行为、未初始化变量和所有其他无法形容的事物的温床。但它已有 20 年历史,包含 500 kloc 和数千个文件,因此无法修复所有这些文件。

它在我的 Windows 7 机器上运行良好。它确实有一个内存不足的处理程序集。我在里面放了一个断点。当它停止时,我查看了已加载的模块,并将它们与我的 Windows 7 机器上的模块进行了比较。

一个明显的区别是...verifier.dll。事实证明,我得到的这个 Windows 10 工作站并不是新的,并且通过 gflags 启用了页面堆分析。这使用的额外内存导致了问题。使用 gflags.exe 关闭页面堆分析使我的内存不足问题消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多