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

我们目前正在考虑构build一个caching系统来保存从SQL数据库中提取的数据,并将其提供给其他一些应用程序(网站,webservice等)。 我们将caching想象成一个windows服务,基本上由一个包含caching条目的智能字典组成。 我的问题是,应用程序的工作集有没有限制(它将在Windows Server 2003下运行)? 或者是物理内存量的限制?

32位或64位? 32位是2GB(一个进程),64位是1TB(企业版2003服务器) 。

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

更新:上述信息在2008年是正确的。见Ohad的答案更多的最新信息。 Windows 2016服务器最多可以有24TB 。

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

显然在64bit中,这个限制发生的方式稍后(让我们在5年:)聊天),但是一切在内存中的一般大小也增长(我发现它是〜1.7倍~2倍),因为增加了字的大小。

我所知道的是,操作系统的虚拟内存理念绝对不会在一个进程中给你几乎无尽的分配空间。 只有这样,所有2.4GB的内存才能被所有(多个)应用程序同时运行。

下面的MSDN表格是对您的查询最准确的答案。 请注意,IMAGE_FILE_LARGE_ADDRESS_AWARE标志不能直接从托pipe编译器中设置,但幸运的是,它可以通过editbin实用工具进行设置。 4GT是指/ 3gb标志。

替代文字

在32位Windows上,您可以通过使用/ 3gb标志启动Windows并将您的应用程序标记为“可识别大地址”

马蒂亚斯,

不是直接问题的答案,而是解决这个问题的另一种方法,它将解决一些重大的陷阱,这可能是caching解决scheme的一大难题。 (对不起,我没有任何关于此事的推荐阅读。)

我们在之前的项目中实现了这个function,而且确实造成了其他问题。

对于离线访问,你可以在桌面上使用sql express来创build数据库的镜像(或者只是你需要caching的位)? 然后,您只需切换应用程序指向的数据库即可。 你甚至可以使用它存储差异并重播这些到服务器 – 虽然这有其他问题。 您可以更改本地副本上的权限,以使其成为只读方式。

您正在考虑创build声音的字典非常类似Sql索引。 如果可以这样构build,我将依靠sql来为您完成这项工作。 为什么要重塑那个轮子? 如果你这样做,你将不得不仔细考虑caching过期和内存pipe理 – 特别是如果这是一个Windows服务。

祝你好运,

山姆

与其他任何Windows程序一样,您受地址空间的限制。 那就是:在32位上,你可以有2GB的地址空间。 在x64上,你可以有8TB。

如果你没有8TB的物理内存,它将开始页面。