gpt4 book ai didi

file - 为什么我的 Go 程序使用打开文件的名称创建另一个 Go 进程,为什么它这么大?

转载 作者:数据小太阳 更新时间:2023-10-29 03:43:14 26 4
gpt4 key购买 nike

我有一个大约 2mb 的大 .json 文件。我正在使用 this code读取 json,稍作修改:

func main() {
pages := getPages()
for {

}
for _, p := range pages {
fmt.Println(p.toString())
}

如您所见,我设置了一个无限循环,这样我就可以让程序在读取进程的 RAM 大小时等待。当我去阅读它时,我发现有 2 个 go 程序在运行。我刚刚做了

去运行 myfile.go

但后来我得到了 2 个二进制文件:一个名为 go,另一个是文件名,没有 json 部分。 go 二进制文件大约有 5mb,但是这个有 36mb...

为什么 go 使用文件名创建另一个进程?它是保存文件的地方以便我可以阅读吗?它为什么这样做?据我所知,文件读取应该由操作系统处理。为什么它与 .json 大小相比如此之大?

另外,当 getPages() 返回时,由于 go 的垃圾收集器,文件对象和 json 对象不应该从内存中删除吗?

最佳答案

Why does go creates another process with the name of the file?

事实并非如此。你做到了。当您执行 go run main.go 时,您正在运行将 main.go 编译为不同可执行文件的 go 程序(您还记得 Go 是一种生成 native 可执行文件的编译语言吗?)并执行第二个可执行文件.您告诉 go 工具这样做,它的行为就如所告知的那样。如果你不喜欢这样:go build -o whatever; ./随便.

Also, shouldn't, when getPages() return, both the file object and json object be deleted from memory because of the go's garbage collector?

是的,这确实发生了。它只是无法以您尝试检查它的方式观察到。 Go 中的内存管理很复杂,与操作系统内存管理的相互作用很复杂(并且依赖于操作系统),操作系统内存管理也很复杂。

非常粗略:未引用的对象由 Go GC 收集,但内存不会“返回”给操作系统,因为从操作系统“返回”和“重新获取”内存是非常昂贵的操作,因此内存不是“返回”到操作系统(除非需要)。

如果您认为内存管理的细节对您感兴趣,请在 SO 或网络上搜索“go does not release memory”。

关于file - 为什么我的 Go 程序使用打开文件的名称创建另一个 Go 进程,为什么它这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42241774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com