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

Sae*_*fam 14 performance garbage-collection jvm go

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

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

提前致谢.


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

Rus*_*Cox 14

Go没有无延迟的垃圾收集.如果您可以指出这些声明的位置,我想尝试纠正它们.

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

type Rect struct {
    Min Point
    Max Point
}

type Point struct {
    X int
    Y int
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

当前Go分布中的收集器是合理的,但决不是最先进的.我们计划在未来一两年内花更多的精力改进它.要明确的是,Go的垃圾收集器肯定不如现代Java垃圾收集器那么好,但是我们相信Go更容易编写不需要那么多垃圾收集的程序,所以净效果仍然可以是垃圾收集在Go程序中比在等效的Java程序中少一个问题.