【问题标题】:Java performance with very large amounts of RAM大量 RAM 的 Java 性能
【发布时间】:2008-12-05 14:07:51
【问题描述】:

我正在探索在具有大量 RAM(从 300GB 到 15TB,可能在 SGI Altix 4700 机器上)的机器上运行 Java 应用程序的可能性,我很好奇 Java 的 GC 是如何可能会在这种情况下发挥作用。

我听说 IBM 或 JRockit 的 JVM 可能比 Sun 的更适合这个。有谁知道在这种情况下有关 JVM 性能的任何研究或数据?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    在 Sun JVM 上,您可以使用选项 -XX:UseConcMarkSweepGC 来打开并发标记和清除收集器,这将几乎完全避免默认 GC 算法的“停止世界”阶段,代价是多一点开销。

    在这样的机器上使用超过 VM 的建议已经过时了。 在现实世界的应用程序中,您通常拥有足够的共享数据,因此 CMS 和一个 JVM 的性能会更好。

    【讨论】:

    • 使用多个 JVM 的正当理由远不止于此,而仅使用一个 JVM 确实会限制您维持正常运行时间、循环更改和处理故障的能力。
    【解决方案2】:

    问题是:您是否要在单个进程 (JVM) 中运行?如果你这样做了,那么你就会有问题。请参阅Tuning Java Virtual MachinesOracle Coherence User Guide 和类似文档。我的经验法则是尽量避免大于 1GB 的堆。而 512MB-1GB 的完整 GC 可能需要不到一秒钟的时间。 2-4GB 的完整 GC 可能需要 5 秒或更长时间。显然这取决于许多因素,但故事的寓意是 GC 开销不会线性扩展,一旦进入一秒范围,性能就会迅速下降。

    【讨论】:

    • Paul,我相信大多数 GC 是在单独的线程中完成的,但偶尔需要完整的 GC,它会阻塞应用程序。不过我不是 100%。
    • Paul:在 Java 5 中,GC 在单独的线程中运行,但在某些情况下它必须移动“特殊”数据(如堆栈)。在这种情况下,它将阻止 VM。 Java 6 更好,但有时仍会阻塞。
    【解决方案3】:

    Sun 的 JVM 允许您配置和优化垃圾收集,但这本身就是一门科学: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

    您可能需要做一些阅读和研究,但对于那种机器,为机器和应用程序优化的 GC 设置可能会产生很大的不同。

    【讨论】:

      【解决方案4】:

      从 5.0 开始,Hotspot JVM 使用一种称为 Ergonomics 的概念来尝试优化内存使用。这不仅仅基于可用的内存量以及影响堆大小、生成大小和垃圾收集算法。

      首先阅读这篇文章,它解释了人体工程学等等:

      https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

      还有一个叫 Brian Goetz 的人写了很多关于 Java 如何分配和使用内存的文章,所有这些文章以及更多可以在这里找到:

      http://www.briangoetz.com/pubs.html

      【讨论】:

        【解决方案5】:

        这根本不是回答您的问题,但如果您计划部署一个大型 Java 应用程序,您可能有兴趣查看 Azul Systems appliances。他们说能够在不造成应用程序暂停的情况下进行垃圾收集,最高可达 670 GB 堆。

        【讨论】:

        • 一个区别是 Azul 是为 Java 设计的,它甚至没有 C 编译器!
        【解决方案6】:

        您可能需要考虑在这台机器上运行一个虚拟的Terracotta 集群。

        【讨论】:

          【解决方案7】:

          唯一能真正告诉你的是SGI。超级计算机的行为不像普通服务器,只是更大。

          但是,我发现当内存位于访问它的处理器的本地时,Java 的性能最好。注意:GC 需要能够端到端地遍历整个内存。这意味着如果您的设计就像许多计算机粘在一起,那么它就不能很好地扩展,这可能就是这种情况。内存模块大小为 32 GB,因此如果您将 JVM 限制为适合此大小,您可能会获得更好的性能。

          【讨论】:

            【解决方案8】:

            这篇文章接受的答案相当陈旧,现在已经过时了。截至 2014 年 9 月,如果您使用的是 Java 7,您可能应该切换到 GC1 收集器。来自 Java 7 update 4 发行说明:

            http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

            “G1 收集器的目标是充分利用当今多处理器服务器中可用的大量内存,同时仍控制垃圾收集延迟的应用程序。需要大堆、具有大活动数据集、具有突发性的应用程序或不均匀的工作负载或遭受垃圾收集引起的长时间延迟,应该从切换到 G1 中受益。”

            【讨论】:

              【解决方案9】:

              当然,关于 GC 将如何执行的答案是“谁在乎?” ;-)

              【讨论】:

              • 嘿,好吧,例如,如果它在执行完整 GC 时导致机器在没有警告的情况下冻结几个小时,那将是有问题的。
              • 问题的作者似乎很在意。呵呵。
              • 我认为 Will 只是幽默地说“GC 甚至不太可能发生”。对于我运行的东西来说,这可能是正确的;对提问者一无所知。 :)
              • 在家里我有 15TB 内存(我玩游戏),简单的 Hallo World 工作正常。
              • @geeeeeeeeeeek:你用 15TB RAM 玩什么游戏?模拟宇宙,也许吧?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-13
              • 2016-12-25
              • 2010-11-14
              • 2011-01-27
              相关资源
              最近更新 更多