Go语言编译后的垃圾回收器如何工作?

15

我正在努力理解golang的垃圾收集器是如何工作的,无论是在编译golang代码还是使用go run时。我猜测go run更加直接,并且只需运行与您要运行的.go文件一起的垃圾收集器。但是,在将代码编译为可执行文件时,是否也将垃圾收集器编译到二进制文件中?


5
除了编译、运行和清理二进制文件这些操作由go run自动完成外,它的工作原理与其它方式并无区别。 - JimB
那么你的意思是说go run编译它,运行它,然后删除二进制文件?那么我的主要问题是,垃圾收集器是否编译到二进制文件中? - Christian Grabowski
3
如果垃圾收集器没有被编译进二进制文件中,它还能怎么存在呢?(或者至少在运行时链接,尽管目前不可用)垃圾收集器不能作为单独的进程运行。 - JimB
我从未提到另一个进程,只是同时运行,因此是线程。 - Christian Grabowski
2
一个线程需要从代码内部生成,因此它需要以某种方式编译到二进制文件中。 - JimB
是的,已经说过了。 - Christian Grabowski
1个回答

23
编译的目标文件中不包含任何垃圾回收器“代码”。 当使用"go run"运行程序时,"go"命令将编译您的源代码,在临时文件夹中创建并启动可执行二进制文件。请见下文。 当一个应用程序被编译并链接成一个可执行二进制文件时,Go运行时也会被包含在可执行文件中,并在二进制文件启动时加载。该运行时提供了垃圾回收器和其他服务,如运行时反射和堆栈跟踪信息。这是一个简单的Hello World应用程序导致像2MB可执行二进制文件的主要原因。

对于 linux/amd64import runtime 是 1.1 MB,而 import runtime 加上 import fmt 则为 2.4 MB。 - peterSO
@peterSO 对于 windows/amd64,运行时大小为0.99 MB,包含 fmt 后大小为2.36 MB。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接