【问题标题】:Dealing with 150GB heap in non interactive application在非交互式应用程序中处理 150GB 堆
【发布时间】:2016-07-09 20:15:11
【问题描述】:

您好,我有一个使用内存数据网格的 150GB 堆内存程序的案例。我有一些来自运营部门的疯狂要求,要使用一台机器。现在我们都知道如果并行垃圾收集器使用超过 150GB 会发生什么情况,如果调用 FULL GC 可能会进行数十分钟的垃圾收集。

我希望随着 Java 9 的到来,Shenandoah 低暂停 GC。不幸的是,据我所知,它没有在 Java 9 中列出。有人知道吗?

无论如何,我想知道 G1 GC 将如何处理这么多的堆内存。

最后一个问题。由于我有应该在 2 小时内完成的非交互式批处理应用程序,可以说。这里的主要目标是确保 Full GC 永远不会启动。如果我确保有足够的内存,可以说可以达到的最大堆是否为 150,并且我为其分配 250GB,我可以满怀信心地说 Full GC GC 永远不会介入或 ?通常如果新生代+老年代触及最大堆,就会触发full GC。可以用其他方式触发吗?

有一个重复的请求,我将尝试在这里解释为什么这个问题不是重复的。首先,我们谈论的是 150GB 堆,它为问题增加了完全不同的维度。其次,我不使用 RMI,因为它在提到的问题中,第三,我在两行之间询问有关 G1 垃圾收集器的问题。此外,一旦我们超出 32GB 堆障碍,我们将进入 64 位地址空间,你无法说服我关于 32GB 的问题相同 更不用说自从 Java 7 例如 PermSpace 不存在以来事情已经发生了一些变化。

【问题讨论】:

  • 如果它是非交互式的,为什么它需要低暂停时间?并行 GC 应该为批处理任务提供最佳吞吐量,因为它不会受到并发收集器效率低下的影响。
  • 是的,而且?您明确表示该应用程序是非交互式。这意味着响应能力——以及因此的暂停时间——应该并不重要。此外,暂停时间取决于内存带宽和核心数量,对于足够强大的机器,它不应该是“几十分钟”,而应该是“分钟”。
  • 我喜欢这个以“现在我们都知道如果并行垃圾收集器使用超过 150GB 会发生什么”的前提。有多少读者真正体验过超过 150GB 的堆?其他人不知道,但可能只是听说过一些事情。我们有一个以约 70G 运行的应用程序,从未遇到过接近一分钟的 GC 暂停。从中推断,我认为没有理由让它变成“几十分钟”,堆大小翻倍……
  • 他们的图表加起来还不到“几十分钟”。

标签: java performance garbage-collection jvm java-9


【解决方案1】:

压缩 GC 的经验法则是,它应该能够每核心每秒处理 1 GB 的 活动对象。

Haswell i7(4 核/8 线程)和 20GB 堆与并行收集器的示例:

[24.757s][info][gc,heap        ] GC(109) PSYoungGen: 129280K->0K(917504K)
[24.757s][info][gc,heap        ] GC(109) ParOldGen: 19471666K->7812244K(19922944K)
[24.757s][info][gc             ] GC(109) Pause Full (Ergonomics) 19141M->7629M(20352M) (23.791s, 24.757s) 966.174ms
[24.757s][info][gc,cpu         ] GC(109) User=6.41s Sys=0.02s Real=0.97s

压缩后的 live set 为 7.6GB。由于并行性,这需要 6.4 秒的 CPU 时间,这转化为

原则上,并行收集器应该能够处理 150GB 堆,在多核系统上完全 GC 时间

当然,这只是一个经验法则。一些可能对其产生负面影响的事情:

  • 分页
  • CPU 热节流
  • 工作负载由非常大的、大量引用的对象组成
  • NUMA 配置中的非本地内存流量
  • 其他进程争用 CPU 时间
  • 大量使用弱/软引用

在某些情况下,可能需要调整才能实现此吞吐量。

如果 Parallel 收集器仍然无法工作,那么 CMS 和 G1 可能是可行的替代方案,但前提是有足够的备用堆容量和可供 JVM 使用的 CPU 内核。他们需要很大的喘息空间来完成他们的并发工作,而不会冒着完全 GC 的风险。

我说没有交互是正确的,但我仍然有严格的许可协议。我需要在一小时内完成整个处理过程。所以我负担不起 30 分钟停止世界盛会。

基本上,您并不真正需要 CMS、G1、Shenandoah 或 Zing 所针对的低暂停时间(它们的目标是

您所需要的只是 STW 暂停不会造成灾难性的严重影响,以至于占用您的大部分计算时间。

这对于大多数可用的收集器来说应该是可行的,忽略串行收集器。

在实践中,有一些病态的边缘情况可能会崩溃,但要达到这一点,您需要根据实际工作负载设置系统并进行一些测试运行。如果您遇到一些实际问题,那么您可以提出更详细的问题。

【讨论】:

  • 谢谢,我需要一些时间来考虑你的帖子。会回来的。
  • 您好,您能谈谈大量使用弱/软引用的情况吗?为什么这会降低速度。是因为内存碎片还是?
  • 在本地 PC 上,与 Parallel 收集器相比,G1 收集器给了我更好的执行时间。我期待相反。我已经运行了几分钟的测试,所以这不是测试设置的事情。
  • 引用处理延长了生命周期,意味着 GC 需要额外的工作。默认情况下它也是单线程的。对于执行时间:并行收集器处理旧代收集的整个实时数据集,G1 不处理(但收集更频繁),这可能会产生影响。并且可能存在一些边缘情况,其中一个 GC 的特定阶段是单线程的,而另一个更好地并行化,在某种程度上这也取决于调整。没有更多信息,一切都是猜测。通常最好使用详细的 GC 日志进行测量以了解事实。
  • 感谢您的回答。接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2017-09-19
相关资源
最近更新 更多