LARGEADRESSAWARE只给我2.5GB

时间:2017-05-31 12:18:56

标签: windows visual-studio

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

  • 32位申请(当然)
  • 64位OS / Win10
  • 编译Visual Studio Comunity 2017
  • 有足够的可用内存(16GB)

在任务管理器中,我应该看到完整的4GB。对于在64位操作系统下运行的32位进程,MSDN声明“4 GB且IMAGE_FILE_LARGE_ADDRESS_AWARE设置为”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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

即使在任务管理器中检查提交大小也无法揭示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的程序的屏幕截图:

Reserved memory in VMMap

Reserved in Process Explorer