Windows 上任何单个进程可以处理的最大内存量

Posted

技术标签:

【中文标题】Windows 上任何单个进程可以处理的最大内存量【英文标题】:The maximum amount of memory any single process on Windows can address 【发布时间】:2012-08-07 03:52:12 【问题描述】:

Memory Limits for Windows Releases 回答 是多少:

在 32 位版本的 Windows 上,单个进程可以映射和寻址 超过 3GB 的虚拟内存。在 64 位版本的 Windows,一个 32 位进程可以映射和寻址不超过 4GB 的 一次虚拟内存。

对于 64 位进程,数量很难计算,因为 有许多重叠的限制,可能适用于所有 种因素。它通常在 7TB 左右。

我的问题:如何验证“3GB”、“4GB”等值?

可以编写一个 C# 程序来证明它吗?有办法吗?

【问题讨论】:

天真的方法(也读作:足够好的方法):开始分配内存,直到遇到 OutOfMemory 异常。 3 GB 限制仅适用于为其配置的系统,仅适用于为其配置的进程,它会损害内核性能。您通常只能获得 2 GB。 GetSystemInfo 将为您提供 lpMinimumApplicationAddress 和 lpMaximumApplicationAddress 中的可用地址空间。当然,您可能没有足够的 RAM 来填充该地址空间,但这就是您可能拥有的数量。 【参考方案1】:

Mark Russinovich 发表了一个关于 windows 内存资源的多部分系列,确实很好地涵盖了这一点。你可以在这里找到它: http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx

他介绍了限制的原因以及测试。测试代码在某处的管子里飘来飘去。

如果您想了解内存资源以及从泄漏各种类型中可以看到的问题,这是一本不错的书。

但是,简而言之,32 位操作系统上的 32 位:2 GB,除非设置为大地址空间感知,在这种情况下为 3 GB。 64 位操作系统上的 32 位:2 GB,除非设置为大地址空间感知,在这种情况下为 4 GB。

64 位进程:2 GB,除非设置为大地址空间感知,在这种情况下,它可以寻址高达 8 TB,除非它托管在限制为 7 TB 的基于 Intel Itanium 的系统上。

Microsoft 在以下位置说明了各种限制(按风格和类型): http://msdn.microsoft.com/en-us/library/aa366778.aspx

【讨论】:

【参考方案2】:

您可以在控制台应用程序中编写某种循环来对此进行测试。

也许创建一个正好为 1MB 的字符串并循环通过一个连接过程来增加它的大小,直到你得到一个 ... Stack Overflow 错误。

在每次迭代时,WriteLine 的大小或迭代次数。

编辑

我要补充一点,因为 STRING 是不可变的(尽管 技术上 是一个引用类型)来使用 OBJECT

编辑两个

Trisped 指出装在 Object 中的字符串仍然是不可变的。

创建一个字节数组 [1024] 应该可以解决问题。

【讨论】:

我是否也需要调整虚拟内存的大小? 我只想减少您需要考虑的未知变量的数量。 所以你建议他们在里面创建一个 x MB 的数组,然后创建一个大小为 x+1 MB 的新数组,他们将在第一个数组和另一个数组中复制,然后在环形?您最好制作一个预期大小的数组,如果可行,则删除该数组并创建一个新数组。不过,这在 C++ 中会更好。 object 也不起作用,对象中的 box 字符串仍然是不可变的。最好的办法是创建一个字节数组。 他们可以做到这一点,但我希望尽可能使用单个对象。我不知道一个对象定义占用了多少内存。

以上是关于Windows 上任何单个进程可以处理的最大内存量的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的两个进程单个生产者/单个消费者。互斥量、事件或信号量哪个更好

C++。如何获得进程从一开始就分配的最大内存量?

单个进程中最大线程数探索

一个32位进程可以占用最大内存

WINDOWS操作系统中可以允许最大的线程数

windows限制进程可以使用的资源cpu 内存