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可以配置为根据需要或根据请求分配更多页面文件空间.
作业对象可以防止消耗超过一定量的内存.
堆的碎片化和它的世代性(加上需要在大对象堆中放入大量的东西)
所有这些意味着硬限制在现实中没有多大用处,并且意味着回答"我理论上可以分配多少内存"的问题比你想象的要复杂得多.
由于它是复杂的人问这个问题可能是试图做一些错误的,并应他们的问题重定向到更有用的东西.
你想做什么似乎需要这样一个问题?
"我只是想知道当前进程的内存负载何时会出现问题,因此我可以采取行动,例如释放一些自定义缓存的项目."
对.这是一个更容易处理的问题.
两个解决方案按复杂程度排列:
注意事项.维护这个大规模缓存(通过它的声音进入磁盘)比重新计算/重新请求数据真的更便宜吗?
如果您的缓存在常用/连续请求的项目之间显示较差的位置,那么将花费很多精力来分页数据.具有有效调整的重新平衡策略的较小缓存很有可能表现得更好(并且对其他正在运行的程序的影响要小得多)
另外:在.Net中,由于内核管理的核心CLR结构的限制,没有可变大小的对象(字符串,数组)的大小可以超过2GB.(以上任何一种解决方案都将从中受益)
这不是取决于你有多少内存吗?
理论上,一个 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 OS/.NET、x32:x32 应用程序(x64 .NET 框架作为安装的 Fx 的 x32 和 x64 版本)
x32 操作系统/网络、AnyCPU:x32 应用程序