加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

关于Golang GC的一些误解,真的比Java算法更领先吗?

发布时间:2019-08-13 23:39:09 所属栏目:优化 来源:William Kennedy
导读:副标题#e# 首先强调下本文的起因是在高可用架构后花园群的一次聊天,大家在争论Golang的GC到底是类似Java的ZGC还是类似Java的CMS GC。我个人的看法是Golang的GC是类似于Java的CMS GC,官方的mgc的注释这么说的: //TheGCrunsconcurrentlywithmutatorthreads

以下做法可以帮助垃圾收集器:

  • 尽可能保持最小的堆。
  • 最佳的一致的起博频率。
  • 保持在每次收集的目标之内。
  • 最小化每次垃圾收集的STW和Mark Assist的持续时间。

所有这些都有助于减少垃圾回收造成延迟,也将提高应用程序的性能和吞吐量。 垃圾收集的频率与此无关。

了解工作量意味着确保使用合理数量的goroutine来完成工作。 CPU瓶颈与IO瓶颈的工作负载不同,需要不同的工程决策,可以参考本文。https://www.ardanlabs.com/blog/2018/12/scheduling-in-go-part3.html

了解数据意味着了解虚要解决的问题。 数据语义一致性是维护数据完整性的关键部分,并允允许你决定在堆上还是栈上分配内存。https://www.ardanlabs.com/blog/2017/06/design-philosophy-on-data-and-semantics.html

结论

对Go语言运行时来说重要的是要认识到有效的内存分配(帮助应用程序的分配)和那些没有无效的内存分配(那些损害应用程序)之间的差异。 然后就只能信任垃圾收集器可以高效的运行。

拥有垃圾收集器是一个很好的权衡。 虽然有垃圾收集的成本,但是却没有内存管理的负担。 Go语言同时兼顾了开发和运行效率。 垃圾收集器是实现这一目标的重要组成部分。

原文地址:

https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html

参考资料:

https://github.com/golang/go/blob/release-branch.go1.5/src/runtime/mgc.go

https://github.com/golang/proposal/blob/master/design/17505-concurrent-rescan.md

https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md

https://blog.golang.org/ismmkeynote

https://www.youtube.com/watch?v=aiv1JOfMjm0&t=1208s

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!