【问题标题】:Largest Heap used in a managed environment? (.net/java)托管环境中使用的最大堆? (.net/java)
【发布时间】:2010-09-16 04:17:16
【问题描述】:

您个人在 Java 或 .NET 等托管环境中使用过的最大堆是多少?你遇到了哪些性能问题,你最终得到的收益是否会随着堆的增大而递减?

【问题讨论】:

    标签: c# java .net memory memory-management


    【解决方案1】:

    我在 64 位 .Net 系统上工作,该系统通常使用 9-12 GB,有时甚至高达 20 GB。即使在垃圾收集时我也没有发现任何性能问题,而且我一直在努力寻找,因为我没想到它会这么好。

    早期版本在某些对象上挂起时间过长,导致偶尔的 GC 释放 3GB+。即便如此,对性能也没有明显影响。系统在 16 核服务器上运行,内存为 32GB,这可能会有所帮助...

    【讨论】:

      【解决方案2】:

      在 .Net 中,在 Windows 32 位上,在事情开始变得非常糟糕(内存不足异常)之前,您只能真正达到大约 1.4 GB 的内存使用量。这是由于 32 位窗口的限制,该限制将单个进程限制为使用超过 2 GB 的 RAM。您可以在 boot.ini 中添加 /3GB 开关,但这只会让您更进一步。如果你想使用大量内存,你应该认真考虑在 64 位版本的 windows 上运行。

      【讨论】:

        【解决方案3】:

        我目前有一个具有 6 GB 内存的生产应用程序。您还需要一个 64 位的机器,以便 JVM 能够处理这么多问题。 垃圾收集器确实是唯一(到目前为止我发现的)性能随着大小而下降的东西,而且只有当你手动启动 System.GC 时,它才会迫使 JVM 在遍历时让所有东西都急速停止6 GB 的对象。也需要20秒。默认的 GC 行为不会这样做,顺便说一句,您必须足够愚蠢才能做到这一点。同样值得研究这种规模的 JVM 调优。

        您还可以找到分布式和集群 JVM 之类的东西,抱歉,没有任何好的参考资料,因为我没有仔细研究这个选项,尽管我确实找到了大型安装的参考资料。

        【讨论】:

          【解决方案4】:

          我不确定你所说的堆是什么意思,但如果你指的是使用的内存,我已经使用了很多,2GB+。我有一个进行图像处理的网络应用程序,它需要将 2 个大型扫描文件加载到内存中进行分析。

          存在性能问题。 Windows 会换出大量内存,然后会产生大量页面错误。一次不需要超过 2 个图像,因为所有请求都获得了这些图像(我一次只允许每个图像集 1 个会话)

          例如,设置文件以供初始查看大约需要 5 秒。在内存中进行简单的分析和缩放会相当快,大约 0.1 到 0.5 秒。

          我仍然需要优化,所以我最终对文件进行了预解析并切成更小的部分,并且只使用当时用户需要的部分。

          【讨论】:

            【解决方案5】:

            我在 java 中使用了 2GB 到 5GB 的内存,但通常当我达到 2GB 以上时,我才真正开始考虑内存优化。收益递减可能会有所不同,从因为您有大量内存而在必要时不进行优化,到没有可用于操作系统/磁盘缓存的内存(这可以帮助您的应用程序整体)。

            对于 Java,我建议随着时间的推移观察每一代的内存使用情况。您是否创建了很多临时对象或有消耗大量内存的持久对象?知道了这些,就可以做很多内存优化。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-02-07
              • 2010-12-07
              • 2017-08-07
              • 2017-04-29
              • 2020-11-25
              • 2010-09-29
              • 1970-01-01
              相关资源
              最近更新 更多