【问题标题】:Who does the garbage collection work in go?垃圾收集在谁中工作?
【发布时间】:2015-04-30 21:40:30
【问题描述】:

根据这个specification,go背后有一个ma​​rk-and-sweep垃圾回收机制。但是谁来做呢?

  • Go 代码将编译为本机二进制文件,对吗?所以不会有像 Java 这样可以依赖的虚拟机。那么这肮脏的工作是谁为我们服务的呢?一个神秘的线程?还是只是一个 goroutine?

  • 垃圾收集过程 stop-the-world 会像 Java 的完整 GC 一样吗?谁能说出 Java 和 Go 之间 GC 机制的区别?我在网上很少能找到资料。

【问题讨论】:

    标签: go garbage-collection


    【解决方案1】:

    您的许多问题都在这里得到解答:

    剩下的:

    但是谁做的呢?

    Go 实现提供的本机代码运行时库。

    (我没有看过实现,但很难想象你可以在 Go 语言中“在线上”为 Go 实现高性能 GC。)

    Go 代码会编译为本机二进制文件,对吧?

    正确。 Go 常见问题解答说得很清楚。

    所以不会有像 Java 这样可以依赖的虚拟机。

    正确。然而,这并没有什么区别。在 Java 的情况下,GC 也是由 Java 运行时提供的本地代码库实现的。

    那么这些肮脏的工作是谁为我们做的呢?一个神秘的线程?还是只是一个 goroutine?

    从 Go 1.1 开始,GC 是并行的,所以在幕后肯定有某种多线程在进行。 Goroutines 是 Go 语言的概念,很难想象你会在本机代码 GC 实现中“线下”使用它们。 (但我可能是错的......)

    但您还需要了解,goroutines 还需要多个线程。常见问题解答说:

    “为什么我的多协程程序不使用多个 CPU?

    您必须设置 GOMAXPROCS shell 环境变量或使用运行时包的同名函数,以允许运行时支持使用多个操作系统线程。"

    看到了吗?底层涉及原生/操作系统线程。

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2011-01-21
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多