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

mab*_*abn 14 garbage-collection jvm go

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

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

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

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

the*_*472 22

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

没有.

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

一个小的谷歌搜索显示类似的解决方案也可用于Java

  • Azul提供一个无间隙收集器,甚至可以扩展到100GB +
  • 红帽正在协助雪兰到了OpenJDK和Oracle ZGC.
  • IBM提供节拍器,也针对微秒暂停时间
  • 各种其他实时JVM

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

Go的收集器是非代数的,非压缩的,并且需要写入障碍(请参阅其他SO问题),这会导致较低的吞吐量/更多的CPU开销,更高的内存占用(碎片)以及更少的缓存高效的对象放置堆(非紧凑的内存布局).