【问题标题】:LARGEADRESSAWARE only gives me 2.5GBLARGEADRESSAWARE 只给我 2.5GB
【发布时间】:2017-05-31 12:18:55
【问题描述】:

我正在编译一个设置了 /LARGEADRESSAWARE 开关的应用程序,但是在运行并查看任务管理器时,该应用程序分配了最大值。约2.5GB 然后它会因内存分配错误而失败。这是正确的行为吗?

  • 32 位应用程序(当然)
  • 64位操作系统/Win10
  • 编译的 Visual Studio 社区 2017
  • 有足够的可用操作系统内存 (16GB)

在任务管理器中,我应该看到完整的 4GB。对于在 64 位操作系统下运行的 32 位进程,MSDN 声明“设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE 的 4 GB”here

这是链接器命令行(去掉了一些路径)

/OUT:"xxx.exe" /MANIFEST /LTCG /NXCOMPAT /PDB:"xxx.pdb" /DYNAMICBASE /LARGEADDRESSAWARE /DEBUG /MACHINE:X86 /SAFESEH:NO /PGD:"xxx.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"xxx.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"xxx" /TLBID:1

【问题讨论】:

标签: windows visual-studio


【解决方案1】:

Hans Passant 在他的评论中给出了一个有用的答案。我没有检查'提交大小',我检查了任务管理器中的私有字节和提交大小,当分配开始失败时显示大约 3.5GB 的内存使用量。谢谢!

【讨论】:

    【解决方案2】:

    即使在任务管理器中检查提交大小也无法揭示 OutOfMemoryException 的所有可能来源,尽管 Hans Passant 猜测得很好。

    以下是一些不起作用的示例:

    • 运行应用程序并保留 3.5 GB 内存,而不是提交它。您很可能也会收到 OutOfMemoryException,但任务管理器中的提交大小列对您没有帮助。在这种情况下,您需要一个工具来显示预留大小,例如VMMapProcess Explorer(在此处使用“虚拟大小”,即保留 + 已提交)

    • 编写以下非常简单的 .NET 程序:

      class Program
      {
          static void Main(string[] args)
          {
              byte[] b = new byte[2*1024*1024*1000];
          }
      }
      

      在这种情况下,您既没有提交也没有保留可以帮助您识别 OutOfMemoryException 来源的内存。这里我们遇到了虚拟内存碎片的问题。

    一些debuggers can help you analyzing OutOfMemoryExceptions

    保留 2 GB 且仅提交 12 MB 的程序的屏幕截图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2017-07-06
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多