什么是Go语言垃圾收集方法与其他方法相比?

时间:2013-01-14 16:42:32

标签: performance garbage-collection jvm go

我对Go编程语言知之甚少,但我看到几个声称Go表示没有延迟的垃圾收集,它比其他垃圾收集器(如JVM垃圾收集器)要好得多。我已经开发了JVM应用程序,我知道JVM垃圾收集器不是无延迟的(特别是在大内存使用中)。

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

提前致谢。


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

1 个答案:

答案 0 :(得分:14)

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程序中的问题。