当前位置:  开发笔记 > 编程语言 > 正文

单个.NET进程是否有内存限制

如何解决《单个.NET进程是否有内存限制》经验,为你挑选了3个好方法。

我们目前正在考虑构建一个缓存系统来保存从SQL数据库中提取的数据,并使其可用于其他几个应用程序(网站,Web服务等).我们想象缓存作为Windows服务运行,基本上由一个保存缓存条目的智能字典组成.我的问题是,应用程序的工作集是否有限制(它将在Windows Server 2003下运行)?或者是物理内存量的限制?



1> Chris S..:

32位还是64位?32位是2gb(对于进程),64位是1TB(企业版2003服务器).

但是,即使在64位上,CLR对象的最大大小也是2gb.

更新:上述信息在2008年是正确的.有关最新信息,请参阅Ohad的答案.Windows 2016服务器最多可以有24TB.


根据我的经验,即使上限理论上为2 GB,一旦达到约1.2 GB,系统将变得不稳定.
实际上,32位进程在x86操作系统下最高可达3GB,在x64操作系统下最高可达4GB.请参阅下面的答案或http://msdn.microsoft.com/en-us/library/aa366778%28VS.85%29.aspx#memory_limits
在数值应用程序中,大对象限制经常发生,因为数据通常由数组支持,而数组是.NET中的CLR对象..NET 4.5已取消限制.最后!http://www.centerspace.net/blog/large-matrices-and-vectors/
它与运行时的2.0版本相关,但我认为它在3.5中没有变化.拥有2gb的单个对象(除非它是一个字节数组)无论如何都是相当不寻常的 - 在你的情况下它将是一个N大小的对象列表,所以你可以.

2> Luke Machows..:

我最近在32位进程上对.NET中的内存限制进行了大量的分析.我们都被一个.NET应用程序中可以分配高达2.4GB(2 ^ 31)的想法所震撼,但不幸的是,这不是真的:(.应用程序进程有很大的空间可供使用,操作系统也很棒但是,.NET本身似乎有自己的开销,对于推动内存限制的典型实际应用程序来说,它本身就有大约600-800MB的占用空间.这意味着只要你分配一个整数数组就可以了1.4GB,你应该期望看到一个OutOfMemoryException().

显然在64位,这个限制发生的方式稍晚(让我们在5年内聊聊:)),但由于字数增加,内存中所有内容的一般大小也会增长(我发现它是~1.7到2倍).

我所知道的是,操作系统中的虚拟内存理念绝对不能在一个进程中为您提供几乎无限的分配空间.只有这样才能使完整的2.4GB可以同时运行所有(许多)应用程序.



3> Ohad Schneid..:

MSDN的下表是您查询的最精确答案.请注意,IMAGE_FILE_LARGE_ADDRESS_AWARE标志不能直接从托管编译器设置,但幸运的是它可以通过editbin实用程序在后期构建时设置.4GT指的是/ 3gb标志.

替代文字

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有