18

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

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

提前致谢。


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

4

1 回答 1

19

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 程序中要小。

于 2014-03-06T04:05:40.160 回答