【问题标题】:How does golang's garbage collector work when compiled?golang 的垃圾收集器在编译时是如何工作的?
【发布时间】:2015-08-24 15:40:35
【问题描述】:

我试图了解 golang 的垃圾收集器在编译 golang 代码时是如何工作的,我猜想在使用 go run 时也是如此。我认为 go run 更直接一些,它只运行垃圾收集器以及您正在运行的 .go 文件。但是当编译成可执行文件时,垃圾收集器是否也被编译到二进制文件中?

【问题讨论】:

  • go run 的工作方式没有区别,只是它会为您编译、运行和清理二进制文件。
  • 所以你是说 go run 编译它,运行它删除二进制文件?所以对于我的主要问题,垃圾收集器是否编译成二进制文件?
  • 如果它没有被编译成二进制文件,它怎么会有垃圾收集器? (或至少在运行时链接,尽管目前不可用)垃圾收集器不能真正作为单独的进程运行。
  • 我从来没有说过另一个进程,只是并发运行,所以一个线程。
  • 线程需要从代码中生成,因此需要以某种方式将其编译成二进制文件。

标签: go compilation garbage-collection


【解决方案1】:

编译的目标文件不包含任何垃圾收集器“代码”。

当使用go run 运行程序时,go 命令将编译您的源代码,在临时文件夹中创建并启动可执行二进制文件。见下文。

当一个应用程序被编译并链接到一个可执行的二进制文件中时,一个 go runtime 也包含在可执行文件中,该可执行文件在二进制文件启动时被加载。此运行时提供垃圾收集器以及其他服务,例如运行时反射和堆栈跟踪信息。这就是为什么一个简单的 Hello World 应用程序会生成 2 MB 可执行二进制文件的主要原因。

【讨论】:

  • 对于linux/amd64import runtime 为 1.1 MB,import runtime 加上 import fmt 为 2.4 MB。
  • @peterSO 对于windows/amd64,运行时为 0.99 MB,包含fmt 为 2.36 MB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
相关资源
最近更新 更多