【问题标题】:Except LARGE_ADDRESS_AWARE, what else factors will limit C# process memory consumption?除了 LARGE_ADDRESS_AWARE,还有哪些因素会限制 C# 进程的内存消耗?
【发布时间】:2018-09-12 05:46:11
【问题描述】:

我接管了一个将 3D 模型加载到内存中的 C# 项目,因此我需要使用大内存。我的平台是64位win10,C#程序是32位,使用Visual Studio 2013开发。我的笔记本电脑有 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来说太远了,所以我想问一下还有没有其他因素会导致内存使用限制?谢谢你的回答。

【问题讨论】:

  • .NET 将对象大小限制为最大 2 GB,即使在 64 位平台上也是如此。 stackoverflow.com/questions/4312169/net-object-size-limit
  • @MitchWheat 我知道。但我确信该程序不会创建 GB 级别的对象。
  • @MitchWheat 你说得对,我撤回了我的评论,意识到这不适用于单个对象。
  • 您正在查看错误的内存统计信息,通常是由于假设任务管理器提供了良好的信息。它显示 RAM 使用情况,与此问题无关。它可以显示相关的,添加“提交大小”列。那一个很好地代表了虚拟内存分配大小。

标签: c# memory out-of-memory 32-bit


【解决方案1】:

如果您尝试调试您的应用程序,您的应用程序将无法使用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?

【讨论】:

  • 您好,感谢您的回答。我以前注意到这个问题。我已经在项目属性中取消选中Enable the Visual Studio hosting process。这不是导致我的问题的原因,但我现在找到了原因。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多