除了LARGE_ADDRESS_AWARE,还有哪些因素会限制C#进程内存消耗?

Except LARGE_ADDRESS_AWARE, what else factors will limit C# process memory consumption?

我接手了一个C#项目,需要加载3D模型到内存,所以需要大内存才能使用。我的平台是64位的win10,C#程序是32位的,使用visual studio2013开发。我的笔记本电脑有 8GB 内存。

在我使用editbin /largeaddressaware $(TargetPath)为C#程序添加LARGE_ADDRESS_AWARE标志之前,它只能消耗内存大约1GB然后程序抛出OutOfMemory异常,添加LARGE_ADDRESS_AWARE标志后,它可以消耗内存大约1.5GB .

我知道在64位平台上32位进程运行上使用LARGE_ADDRESS_AWARE,内存限制是4GB。我也看过一些文章,说因为.NET后端工作和内存碎片,进程无法真正分配内存到4GB。

但是我觉得1.5GB比4GB差太多了,请问有没有其他因素会导致内存使用限制?谢谢你的回答。

如果您尝试调试您的应用程序,您的应用程序将不会 运行 和 LARGEADDRESSAWARE(因为 vshost.exe 未正确标记).

How to: Disable the Hosting Process

另外,请注意 GC,在这种情况下它不会主动清理内存。因此,这可能是调用

有益的少数情况之一
GC.Collect()
GC.WaitForPendingFinalizers()

其他资源

GC.Collect Method ()

GC.WaitForPendingFinalizers Method ()

如果你还没有,也看看这个问题

Can I set LARGEADDRESSAWARE from within Visual Studio?

终于找到问题了。
我的 C# 项目有一些代码来检测它的内存使用情况,当它占用内存超过 1GB 时,它会抛出 OutOfMemoryException 本身。在我注释掉这些代码之后,程序可以达到 3GB 的内存使用量。