所以:https://groups.google.com/forum/?fromgroups#!topic/golang-dev/Ab1sFeoZg_8:
今天我向垃圾收集器提交了更改,这些更改使典型的最坏情况下的世界时间小于100微秒。这应该特别改善具有许多活动goroutine的应用程序的暂停,这可能会显着延长暂停时间。
如果JVM用户长时间挣扎,那么高GC暂停就是其中之一。
什么是(架构?)约束阻止JVM将GC暂停降低到Go级别,但是不影响Go?
答案 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开发和进化的好文章。