首页  >  文章  >  后端开发  >  为什么 Go 提供亚毫秒级的 GC 暂停,而 JVM 却一直在苦苦挣扎?

为什么 Go 提供亚毫秒级的 GC 暂停,而 JVM 却一直在苦苦挣扎?

DDD
DDD原创
2024-10-31 21:23:02564浏览

Why Does Go Offer Sub-Millisecond GC Pauses While JVMs Historically Struggle?

深入研究影响 JVM 与 Go 中 GC 暂停的架构差异

JVM 中与高 GC 暂停的持续斗争促使人们将其与Go 具有将暂停时间减少到 1 毫秒以下的卓越能力。为了阐明这种差异,让我们深入研究影响每个平台中 GC 性能的架构限制。

Go 的暂停优化策略

Go 的垃圾收集器 (GCGC)优先考虑最大限度地减少 GC 暂停,利用多种技术的组合:

  • 非压缩、非分代: 这种设计简化了收集过程,降低了内存碎片和影响暂停的风险
  • 并发标记和清除:标记和清除操作与程序执行同时运行,最大限度地减少停止世界暂停的持续时间。
  • 写入屏障:为了在并发标记期间保持正确性,实现了写屏障,这会引入一些性能开销。

JVM 的平衡行为

相反JVM GC 传统上关注吞吐量和压缩,以提高大型服务器级计算机的性能。它们采用分代收集和压缩机制,这会带来以下权衡:

  • 压缩:压缩可以防止内存碎片,从而实现更高效的内存分配和缓存局部性。
  • 分代收集:根据对象的生命周期将对象分为几代,通过将短期对象提升到更快收集的空间来优化性能。
  • Stop-the-world 暂停: 每当旧的、永久的空间需要收集时,就会发生这些暂停。

JVM 的最新创新

认识到需要改进暂停时间,JVM 生态系统已经开发了新的收集器:

  • Oracle ZGC:在 OpenJDK 16 中引入,ZGC 在执行压缩时实现了 1 毫秒以下的暂停,克服了早期 JVM GC 的限制。
  • Shenandoah: Shenandoah 现已在 OpenJDK 17 中提供,它采用与 ZGC 类似的技术,通过并发压缩实现可比的性能。

架构注意事项

Go 和 JVM GC 之间的架构差异源于它们不同的设计理念和性能优先级:

  • GoGC:通过采用非压缩、非分代方法优先考虑暂停时间。
  • JVM GC:强调吞吐量和压缩,这历史上是以牺牲暂停时间为代价的,但 ZGC 和 Shenandoah 等最近的发展解决了这种权衡。

总之,Go 的 GCGC 和 JVM GC 设计中的架构差异对它们各自的暂停有影响次。 Go 通过简单性和并发性优先考虑减少暂停,而 JVM GC 传统上会为了吞吐量和压缩而牺牲暂停时间。然而,JVM 技术的进步,特别是 ZGC 和 Shenandoah,正在缩小差距,提供与 Go 相当的暂停时间。

以上是为什么 Go 提供亚毫秒级的 GC 暂停,而 JVM 却一直在苦苦挣扎?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn