【问题标题】:What is the Go language garbage collection approach compared to others?Go 语言的垃圾收集方法与其他方法相比是什么?
【发布时间】:2013-01-14 16:42:32
【问题描述】:

我对 Go 编程语言了解不多,但是我看到一些说法说 Go 具有无延迟的垃圾收集,并且比其他垃圾收集器(如 JVM 垃圾收集器)要好得多。我已经为 JVM 开发了应用程序,并且我知道 JVM 垃圾收集器不是无延迟的(特别是在使用大量内存时)。

我想知道,Go 中的垃圾收集方法与其他使其无延迟的方法有什么区别?

提前致谢。


编辑: @All 我完全编辑了这个问题,如果你觉得它有建设性,请投票重新打开这个问题。

【问题讨论】:

  • 在 Java 游戏中,我永远不会让垃圾收集器运行,直到达到游戏中的合适点(例如暂停菜单)。为了实现这一点,我总是有某种管理器类,它保留对所有创建对象的引用,并在达到暂停菜单或关卡结束时释放它们。
  • 您可能会喜欢这个进行比较。 code.google.com/p/jgo 如果 Go 支持 struct 这有可能显式避免 GC,而不是希望 JIT 隐式为您执行此操作。
  • @JonTaylor 你为什么这样做?是因为 JVM 垃圾收集器性能还是其他原因?
  • @SaeedZarinfam 是的,就性能而言,垃圾收集器严重影响帧速率并且完全不可预测。除了保留所有资源并仅在安全的情况下释放之外,没有办法告诉它在某个时候专门收集。
  • @All 我完全编辑了这个问题,如果你同意,请投票重新打开这个问题。

标签: performance garbage-collection jvm go


【解决方案1】:

Go 没有无延迟的垃圾收集。如果您能指出这些说法在哪里,我想尝试纠正它们。

我们认为 Go 优于 Java 的一个优势是它可以让您更好地控制内存布局。例如,一个简单的 2D 图形包可能会定义:

type Rect struct {
    Min Point
    Max Point
}

type Point struct {
    X int
    Y int
}

在 Go 中,一个 Rect 只是内存中四个连续的整数。您仍然可以将 &r.Max 传递给期望 *Point 的函数,这只是指向 Rect 变量 r 中间的指针。

在 Java 中,等效的表达式是创建 Rect 和 Point 类,在这种情况下,Rect 中的 Min 和 Max 字段将是指向单独分配的对象的指针。这需要更多分配的对象,占用更多的内存,并给垃圾收集器更多的跟踪和更多的工作。另一方面,它确实避免了创建指向对象中间的指针。

与 Java 相比,Go 为程序员提供了对内存布局的更多控制权,您可以使用该控制权来减少垃圾收集器的负载。这在具有大量数据的程序中非常重要。由于缓存效应等,对内存布局的控制对于从硬件中提取性能也可能很重要,但这与原始问题相切。

当前 Go 发行版中的收集器是合理的,但绝不是最先进的。我们计划在未来一两年内投入更多精力来改进它。要清楚, Go 的垃圾收集器当然不如现代 Java 垃圾收集器,但我们相信在 Go 中编写不需要那么多垃圾收集的程序会更容易,因此最终效果仍然是垃圾收集更少Go 程序中的问题比等效的 Java 程序中的问题。

【讨论】:

  • 我认为这与 java 语言的关系比与 jvm 本身的关系更大...scala,jvm 语言的值类做类似的工作docs.scala-lang.org/overviews/core/value-classes.html我希望有更多的资源来比较 jvm go gc,两者都很有趣,我觉得两者都被很多神话和误解所包围......
  • @SaeedZarinfam,你可能读错了。我在那里没有看到“无延迟垃圾收集”的说法(也没有在quick search of its history 中看到)。它只是说“[...] 有信心我们可以在 [...] 没有显着延迟的情况下实施它”(强调添加)。过去,紧随其后的是关于 current 实现的括号注释(该注释已被移至它自己的段落)。对我来说,“没有明显的延迟”!=“无延迟”,它还指未来的改进。
猜你喜欢
  • 2011-09-18
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2012-04-02
  • 2010-12-17
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多