.NET进程可以分配的最大内存

Rau*_*otz 26 .net memory-management

垃圾回收器可以为.NET进程分配的最大内存是多少?当我编译为x64时,Process.GetCurrentProcess.MaxWorkingSet返回大约1,4GB,但是当我编译到AnyCPU(x64)时,返回相同的数字.对于x64,它应该更像是任务管理器中显示的"限制"值.如何在所有情况下获得超出OutOfMemory-Exceptions的正确数字?

一些示例应该返回的方法:

1)机器配置:x64-Windows,4GB物理内存,4GB页面文件
- 作为64位进程:8GB
-As 32位进程:1.4GB

2)机器配置:x64-Windows,1GB物理内存,2GB页面文件
- 作为64位进程:3GB
-As 32位进程:1.4GB

3)机器配置:x32-Windows,4GB物理内存,4GB页面文件
- 作为64位进程:不会发生
- 作为32位进程:1.4GB

4)机器配置:x32-Windows,512MB物理内存,512MB页面文件
- 作为64位进程:不会发生
- 作为32位进程:1.0GB

Shu*_*oUk 17

Windows可以配置为根据需要或根据请求分配更多页面文件空间.
作业对象可以防止消耗超过一定量的内存.
堆的碎片化和它的世代性(加上需要在大对象堆中放入大量的东西)

所有这些意味着硬限制在现实中没有多大用处,并且意味着回答"我理论上可以分配多少内存"的问题比你想象的要复杂得多.

由于它是复杂的人这个问题可能是试图做一些错误的,并应他们的问题重定向到更有用的东西.

你想做什么似乎需要这样一个问题?

"我只是想知道当前进程的内存负载何时会出现问题,因此我可以采取行动,例如释放一些自定义缓存的项目."

对.这是一个更容易处理的问题.

两个解决方案按复杂程度排列:

  1. 使您的缓存使用WeakReferences
    • 这意味着系统几乎可以为你释放一些神奇的东西,但你几乎无法控制替换政策等事情
    • 这取决于缓存的数据比密钥和弱引用的开销大得多
  2. 注册垃圾收集通知
    • 这可以让你掌控一切.
    • 您依赖于具有适当最大尺寸的系统用于GC生成,这可能需要一段时间才能达到稳定状态.

注意事项.维护这个大规模缓存(通过它的声音进入磁盘)比重新计算/重新请求数据真的更便宜吗?
如果您的缓存在常用/连续请求的项目之间显示较差的位置,那么将花费很多精力来分页数据.具有有效调整的重新平衡策略的较小缓存很有可能表现得更好(并且对其他正在运行的程序的影响要小得多)

另外:在.Net中,由于内核管理的核心CLR结构的限制,没有可变大小的对象(字符串,数组)的大小可以超过2GB.(以上任何一种解决方案都将从中受益)


Nic*_*ise 3

这不是取决于你有多少内存吗?

理论上,一个 x64 进程可以分配 EB(etabytes?) 的 RAM,我认为 - 即很多。但如果你这样做了,你的机器就会开始疯狂地调页,然后通常就会死掉。

在 32 位模式下情况有所不同,因为你不能在 Windows 的任何进程中分配超过 1GB 的 RAM(是的,有办法解决它,但它并不漂亮)。实际上,每个 .NET 进程大约需要 7-800meg,因为 .NET 保留了一些空间。

无论哪种方式,在 32 位中,您最多可以使用 3GB - 操作系统为其自身保留 1GB 的虚拟空间。

在 64 位中,它应该是 2^64,这是一个很大的数字,但http://en.wikipedia.org/wiki/X86-64说它是 256TB 的虚拟空间和 1TB 的真实 RAM。无论哪种方式,它都比您的计算机中可能拥有的要多得多,因此它将访问页面文件。

借助 64 位操作系统和 64 位运行时,基于 .NET 2.0 的应用程序现在可以将多出 500 倍的内存用于基于服务器的缓存等数据。

这也有一些很好的信息http://www.theserverside.net/tt/articles/showarticle.tss?id=NET2BMnov64Bit

顺便说一句,如果您使用的是 x64 机器(即 x64 机器 + x64 操作系统),则针对 AnyCPU 和 x64 进行编译会执行相同的操作 - 它以 x64 模式运行。唯一的区别是如果您使用 AnyCPU vrs x86:

  • x64 操作系统/.NET、AnyCpu:x64 应用程序
  • x64 操作系统/.NET、x64:x64 应用程序
  • x64 OS/.NET、x32:x32 应用程序(x64 .NET 框架作为安装的 Fx 的 x32 和 x64 版本)

  • x32 操作系统/网络、AnyCPU:x32 应用程序

  • x32 OS/.NET、x64:崩溃并烧伤宝贝!(其实只是优雅地死去)
  • x32 操作系统/.NET、x32:x32 应用程序。

  • 抱歉,埃里克,但你需要阅读它,并实际尝试一下。32 位系统的理论限制可能是 4GB,但 Windows 将您限制为 3GB(另一个 GB 用于系统,您必须在启动参数中使用 /3GB 才能获得该容量),并且虽然每个进程都有一个4GB 空间,Windows 或 .NET FX 对不执行特殊操作(SQL 和 Exchange 执行)的进程强制执行 1GB 限制。 (2认同)
  • 测试它的简单方法:在循环中分配内存,然后查看何时出现内存不足错误。对我来说,32 位系统上的内存大小一直在 750-800MB 左右。 (2认同)