为什么Go可以将GC暂停降低到1ms以下而JVM没有?

时间:2016-10-29 10:40:13

标签: go garbage-collection jvm

所以:https://groups.google.com/forum/?fromgroups#!topic/golang-dev/Ab1sFeoZg_8

  

今天我向垃圾收集器提交了更改,这些更改使典型的最坏情况下的世界时间小于100微秒。这应该特别改善具有许多活动goroutine的应用程序的暂停,这可能会显着延长暂停时间。

如果JVM用户长时间挣扎,那么高GC暂停就是其中之一。

什么是(架构?)约束阻止JVM将GC暂停降低到Go级别,但是不影响Go?

3 个答案:

答案 0 :(得分:22)

  

阻止JVM将GC暂停降低到golang级别的(架构?)约束是什么

没有。

  

如果JVM用户长时间挣扎,那么高GC暂停就是其中之一。

有点谷歌搜索显示类似的解决方案也适用于Java

openjdk中的其他收藏家与Go不同,是压缩世代收藏家。这是为了避免碎片问题,并通过启用凹凸指针分配和减少在GC中花费的CPU时间,在具有大堆的服务器级机器上提供更高的吞吐量。至少在良好的条件下,CMS可以实现一位数的毫秒暂停,尽管与年轻一代的收藏家配对。

Go的收集器是非代数的,非压缩的,需要写入障碍(请参阅此other SO question),这会导致较低的吞吐量/更多的CPU收集,更高的内存占用(碎片)和堆上对象的缓存效率降低(非紧凑内存布局)。

答案 1 :(得分:0)

根据此演示文稿Getting to Go: The Journey of Go's Garbage Collector,Go收集器仅将堆的一半用于实时数据:

  

堆2倍于活动堆

我的印象是Java GC通常旨在提高堆的利用率,因此它们在这里进行了很大的权衡。

答案 2 :(得分:0)

  

哪些(体系结构?)约束会阻止JVM   将GC暂停降低到Go级别,但不会影响Go吗?

主要我要说的是java是面向参考的语言,而Go是面向价值的语言。

它有很多方面,对象元数据,并发处理...当然,Java不允许将基元放入集合中,这给大量的对象带来了很多开销,在Golang中,您拥有数组,切片和Map支持原始类型...

Here是一篇有关Golang GC开发和进化的好文章。