【问题标题】:Maximum .NET achievable memory?.NET 可达到的最大内存?
【发布时间】:2010-10-17 12:54:38
【问题描述】:

在 .NET 托管代码中可以实现的最大内存量是多少?它是否取决于实际架构(32/64 位)?

【问题讨论】:

  • 是的,有.. 试一试,看看运行时炸弹在 32 位架构上大约 900MB.. 或者只是运行一个体面的,甚至不是很大的数据集.. 真的很伤心。跨度>
  • 好吧,如果你需要一个事实,那么你最好加载它并在它到达时注意 OutOfMemory 异常。问题是你只需要运行几个这样的应用程序(你知道体面的大小) 并且瞧:CLR 是高效的理论家对此非常关注。
  • 我可以确认 900 MB 的限制,这是实践中的限制。在过去的 6 年中,我在 3 个不同的 WinForms 应用程序中反复看到它。最初几年大约是 700 MB,而我见过的最大容量大约是 1050 MB。

标签: .net memory


【解决方案1】:

.NET 代码没有确切的数字。

如果您在 32 位 Windows 上运行;您的进程最多可寻址 2 GB,如果在 Windows Server 2003 上使用 /3GB 开关,则为 3 GB。

如果您在 64 位机器上运行 64 位进程,则您的 进程 可以寻址多达 8 TB 的地址空间,前提是存在那么多 RAM。

然而,这还不是全部,因为 CLR 会为每个进程占用一些开销。同时,.NET 会尝试分块分配新内存;如果地址空间是碎片化的,这可能意味着您无法分配更多内存,即使有一些可用。

【讨论】:

  • 这不是真的。 x86 上的 Windows 将用户模式分区大小限制为 8 TB (8192 GB)。
  • "可以寻址整个 64 位地址空间,如果存在那么多 RAM"没有办法是正确的,应该编辑..
  • 64 位 Windows 下的 32 位进程可以访问 4GB 的用户空间(具有大地址意识...与 /3GB 开关下访问 3GB 的标准相同)。
  • 您对 x64 的 8 TB 限制没问题,我编辑了答案来解决这个问题。 (猜我写那个答案的时候有点太快了:-)
  • 您可以寻址超过 RAM 的大小,因为分配的虚拟内存不必在 RAM 中,它可以在页面文件中。
【解决方案2】:

在 C# 2.0 和 3.0 中,托管代码中单个对象的大小也有 2G 的限制。

【讨论】:

    【解决方案3】:

    .NET 进程可以处理的内存量取决于它是否在 32/64 位机器上运行,以及它是作为 CPU 无关进程还是 CPU 特定进程运行。

    默认情况下,.NET 进程与 CPU 无关,因此它将使用 Windows 版本自然的进程类型运行。在 64 位中它将是一个 64 位进程,而在 32 位中它将是一个 32 位进程。您可以强制 .NET 进程以特定 CPU 为目标,并使其在 64 位机器上作为 32 位进程运行。

    如果排除大地址感知设置,以下是各种细分

    • 32位进程可以寻址2GB
    • 64位进程可以寻址8TB

    这里是基于 Windows 提供的各种选项的可寻址空间的完整细分的链接。

    http://msdn.microsoft.com/en-us/library/aa366778.aspx

    【讨论】:

      【解决方案4】:

      对于 64 位 Windows,虚拟内存大小为 16 TB,在用户模式和内核模式之间平均分配,因此用户进程可以寻址 8 TB (8192 GB)。这比 64 位可寻址的整个 16 个EB 空间要少,但它仍然比我们习惯的 32 位要多得多。

      【讨论】:

        【解决方案5】:

        我最近在 .NET 中对 32 位进程的内存限制进行了广泛的分析。我们都被我们可以在 .NET 应用程序中分配高达 2.4GB (2^31) 的想法轰炸了,但不幸的是这不是真的 :(。应用程序进程有这么多的空间可以使用,操作系统做得很好然而,为我们管理它的工作,.NET 本身似乎有自己的开销,对于推动内存限制的典型现实世界应用程序,它大约占 600-800MB。这意味着,一旦你分配一个整数数组,大约需要1.4GB,您应该会看到 OutOfMemoryException()。

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

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

        我希望这种见解有所帮助。

        我最初在这里回答了一些相关的问题(我还是个新手,所以不确定我应该如何做这些链接):

        Is there a memory limit for a single .NET process

        【讨论】:

        • 为什么要多次发布相同的答案?
        • 对不起,我是菜鸟。您如何链接本网站上的相关问题和答案?
        【解决方案6】:

        .NET 运行时可以为其主机中的用户模式程序分配所有可用内存。请注意,这并不意味着所有内存都将专用于您的程序,因为某些(相对较小的)部分将专用于内部 CLR 数据结构。 在 32 位系统中,假设设置为 4GB 或更多(即使启用了 PAE),您应该能够获得最多大约 2GB 分配给您的应用程序。在 64 位系统上,您应该能够获得 1TB。有关 Windows 内存限制的更多信息,请查看this page。 这里提到的每个数字都必须除以 2,因为 Windows 保留地址空间的高半部分供内核模式下运行的代码使用(环 0)。 另外,请注意,只要 32 位系统的限制超过 4GB,就暗示使用PAE,因此除非操作系统支持 4gt,否则您仍然不能真正超过 2GB 限制,在这种情况下,您可以达到3GB。

        【讨论】:

          【解决方案7】:

          是的,在 32 位环境中,您只能使用 4GB 的地址空间,但 Windows 声称只有一半。在 64 位架构上,它要大得多。我相信是 4G * 4G

          在 Compact Framework 上,它通常是几百 MB 的量级

          【讨论】:

          • 说4G * 4G会误导人们认为16G。真的,4G 是 2^32 字节,所以将近 40 亿。而 64 位的限制是 2^64 = (2^32)*(2^32),也就是 (40 亿)*(40 亿),比 16G 多很多。
          【解决方案8】:

          我认为其他答案非常幼稚,在现实世界中,在消耗 2GB 内存之后,您的应用程序将表现得非常糟糕。根据我的经验,GUI 通常会变得非常笨重,在大量内存消耗后无法使用。

          这是我的经验,显然造成这种情况的实际原因可能是对象变得太大,因此对这些对象的所有操作都需要太多时间。

          【讨论】:

            【解决方案9】:

            以下博客文章详细介绍了 x86 和 x64 最大内存。它还有一个小工具(可用源),可以轻松地对不同的内存选项进行东移: http://www.guylangston.net/blog/Article/MaxMemory.

            【讨论】:

              猜你喜欢
              • 2010-10-30
              • 1970-01-01
              • 2018-03-29
              • 2023-03-20
              • 1970-01-01
              • 2015-04-03
              • 2019-01-06
              • 2021-03-05
              • 1970-01-01
              相关资源
              最近更新 更多