【问题标题】:G1 slower than default garbage collector on Java 7G1 比 Java 7 上的默认垃圾收集器慢
【发布时间】:2016-05-27 02:08:04
【问题描述】:

我一直在尝试在我的应用程序上使用 G1,并注意到与 java 7u91 上的默认垃圾收集器相比,启动应用程序需要更多时间。另一方面,像 G1 应该执行的那样执行的集合更少。

G1 变慢有什么原因吗?我的应用程序使用 128mb 的最小和最大堆,超过 Solaris 64 位版本,VM 没有自定义参数。 (Java服务器版)

【问题讨论】:

  • 您为什么不希望他们将更快的垃圾收集器设为默认值?
  • gc1 不是比其他垃圾收集器更有效率吗?如果没有,为什么要迁移到它。
  • 是什么让你这么想?如果您正在设计 Java,为什么默认情况下没有最佳性能?我希望非默认垃圾收集器只会在极少数、非常特殊的情况下更好。
  • 好的,这样想我可以使用具有最佳选项的 CMS 来调整应用程序。在我看来,如果 java 9 倾向于将 gc1 作为默认值,那肯定是有充分理由的。
  • 如果 java 9 有 GC1 作为默认值,那可能是因为他们在 Java 9 中改进了 GC1。

标签: java garbage-collection heap-memory g1gc


【解决方案1】:

并注意到启动应用程序需要更多时间

这有几个原因

第一:在大多数情况下,默认收集器是并行收集器,也称为吞吐量收集器。相对于在应用程序代码中花费的等待时间而言,它是最有效的一种。[1]。它不必承担执行并发工作的额外费用。

G1 主要通过在部分并发的收集上花费额外的 CPU 周期来优化大型堆上的较低暂停时间,这需要您有空闲的 CPU 周期。吞吐量只是次要目标。

第二个:启用G1比使用的算法改变更多,很多默认设置也改变了。

diff <(java -XX:+UseG1GC -XX:+PrintFlagsFinal) <(java -XX:+PrintFlagsFinal) 显示如何更改其他标志

在 java 8 上,显着影响 GC 行为的差异有以下几点:

<     uintx GCTimeRatio                               = 9                                   {product}
>     uintx GCTimeRatio                               = 99                                  {product}
<     uintx MaxGCPauseMillis                          = 200                                 {product}
>     uintx MaxGCPauseMillis                          = 18446744073709551615                    {product}

第三:应用程序启动并不是衡量任何事情的好方法,因为这是一个瞬态事件,堆仍然必须稳定到其最终大小。收集器以稳态运行为目标,可能会以不同方式处理此类瞬变。


在“旧 RISC 服务器”和 128 MB 的堆大小上,您肯定希望坚持使用并行或串行收集器。这样的配置并不能从 G1 提供的功能中受益。

[1] 对于 CPU 周期而不是 wall time,它将是串行收集器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 2016-01-17
    • 2011-03-18
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多