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

时间:2008-10-14 08:11:12

标签: .net memory .net-3.5 process limit

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

6 个答案:

答案 0 :(得分:44)

32位还是64位? 32位是2gb(对于一个进程),64位是1TB (enterprise edition 2003 server)

However, the maximum size of a CLR Object is 2gb甚至在64位上。

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

答案 1 :(得分:20)

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

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

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

答案 2 :(得分:13)

MSDN中的下表是您查询的最准确答案。请注意,IMAGE_FILE_LARGE_ADDRESS_AWARE标志不能直接从托管编译器设置,但幸运的是它可以在构建后via the editbin utility设置。 4GT指的是/ 3gb标志。

alt text

答案 3 :(得分:4)

在32位Windows上,您可以通过使用/ 3gb标志启动Windows并将您的应用标记为“大地址识别”来获得更多内存

答案 4 :(得分:1)

的Matthias,

实际上并不是直接问题的答案,而是解决这个问题的另一种方法,它可以解决一些重大陷阱,这可能是缓存解决方案的一个主要问题。 (对不起,我没有任何关于此事的推荐阅读。)

我们在之前的项目中实现了这一点,并确实产生了其他问题。

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

您正在考虑创建声音的词典非常类似于Sql索引。如果您能够以这种方式构建它,我会依赖sql来为您完成这项工作。为什么重新发明那个轮子?如果这样做,您将不得不仔细考虑缓存过期和内存管理 - 特别是如果这是一个Windows服务。

祝你好运,

萨姆

答案 5 :(得分:0)

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

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