垃圾收集器可以为 .NET 进程分配的最大内存是多少?当我编译到 x64 时,Process.GetCurrentProcess.MaxWorkingSet 返回大约 1,4GB,但是当我编译到 AnyCPU (x64) 时,返回相同的数字。对于 x64,它应该更像是任务管理器中显示的“限制”值。我怎样才能获得在所有情况下超出时都会导致 OutOfMemory-Exceptions 的正确数字?
该方法应返回的一些示例:
1)机器配置:x64-Windows,4GB物理内存,4GB页面文件
-64位进程:8GB
-32 位进程:1.4GB
2)机器配置:x64-Windows,1GB物理内存,2GB页面文件
-64 位进程:3GB
-32 位进程:1.4GB
3)机器配置:x32-Windows,4GB物理内存,4GB页面文件
-作为 64 位进程:不会发生
-32 位进程:1.4GB
4)机器配置:x32-Windows,512MB物理内存,512MB页面文件
-作为 64 位进程:不会发生
-32位进程:1.0GB
Windows 可以配置为按需分配更多页面文件空间,或者根据要求 http://windowshelp.microsoft.com/Windows/en-GB/help/89ca317f-649d-40a6-8934-e5707ee5c4b81033.mspx.
工作对象 http://msdn.microsoft.com/en-us/library/system.activities.design.base.propertyediting.editorreuseattribute(VS.100).aspx可以防止消耗超过一定量的内存。
堆的碎片及其分代性质(加上需要将大量内容放入大型对象堆中)
所有这些都意味着硬限制在现实中没有多大用处,并且意味着回答“理论上我可以分配多少内存”的问题比您想象的要复杂得多。
因为它很复杂任何人asking这个问题可能是想尝试做某事wrong并且应该将他们的问题转向更有用的问题。
你想做什么而显得有必要提出这样的问题?
“我只是想知道进程的当前内存负载何时会出现问题
这样我就可以采取一些措施,例如释放自定义缓存中的某些项目。”
正确的。这是一个更容易处理的问题。
两种解决方案(按复杂程度排序):
- Make your caches use WeakReferences http://msdn.microsoft.com/en-us/library/system.weakreference.aspx
- 这意味着系统几乎会神奇地为您释放一些东西,但您对替换政策等事情几乎没有控制权
- 这依赖于缓存的数据比键大得多以及弱引用的开销
- Register for notification of Garbage Collections http://msdn.microsoft.com/en-us/library/cc713687.aspx
- 这可以让您控制释放事物。
- 您依赖于具有适合 GC 代的最大大小的系统,这可能需要一段时间才能达到稳定状态。
注意事项。
是吗really维护如此庞大的缓存(根据声音存储到磁盘)比重新计算/重新请求数据更便宜。
如果您的缓存在常见/连续请求的项目之间表现出较差的局部性,那么将花费大量精力将数据分页进出。具有有效调整的替换策略的较小缓存很有可能获得更好的性能(并且对其他正在运行的程序的影响要小得多)
顺便说一句:在 .Net 中,由于内存管理的核心 CLR 结构的限制,任何可变大小的对象(字符串、数组)的大小都不能超过 2GB。 (以上任一解决方案都将从中受益)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)