我正在使用/ LARGEADRESSAWARE开关集编译应用程序,但在运行并查看任务管理器时,应用程序会分配最大值。约2.5GB然后失败,内存分配错误。这是正确的行为吗?
在任务管理器中,我应该看到完整的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
答案 0 :(得分:2)
Hans Passant在评论中给出了有用的答案。我没有检查'提交大小',我检查了私有字节,并且在分配开始失败时,任务管理器中的提交大小显示了3.5GB的内存使用量。谢谢!
答案 1 :(得分:1)
即使在任务管理器中检查提交大小也无法揭示OutOfMemoryException的所有可能来源,尽管Hans Passant很好地猜测了这一点。
以下是一些不起作用的例子:
运行一个应用程序并保留 3.5 GB内存而不是提交。很可能你也得到了OutOfMemoryException,但是任务管理器中的提交大小列对你没有帮助。在这种情况下,您需要一个工具来显示保留大小,例如VMMap或Process 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的程序的屏幕截图: