为什么简单的 Go 应用程序占用大量内存
Why simple Go app consume high memory usage
这是一个非常简单的应用程序:
package main
import "fmt"
func main() {
for i:= 0; i < 100000; i++ {
go func (){
fmt.Println("hello message.")
}()
}
fmt.Scanln()
fmt.Println("done")
}
在 windows 上 运行 应用程序后,查看 windows 任务管理器我看到了这个状态:
有人能说说为什么吗?
同时启动 goroutines 运行,彼此独立。处理它们是 goroutine 调度程序的责任和义务。
goroutine 是一个轻量级线程:它的成本比 OS 线程低很多,但仍然需要一些成本。新 goroutine 的初始堆栈是几 KB(大约 8KB),并根据需要增长/收缩。参见 Goroutines 8kb and windows OS thread 1 mb。
鉴于您在没有任何同步的情况下启动了 100,000 个 goroutine,很可能您将有 100,000 个 goroutine 运行ning 在它们中的任何一个完成之前。估计的内存需求为:
100,000 * 8KB = 800 MB
因此您的应用使用 884MB 的内存与估算值基本一致。
这是一个非常简单的应用程序:
package main
import "fmt"
func main() {
for i:= 0; i < 100000; i++ {
go func (){
fmt.Println("hello message.")
}()
}
fmt.Scanln()
fmt.Println("done")
}
在 windows 上 运行 应用程序后,查看 windows 任务管理器我看到了这个状态:
有人能说说为什么吗?
同时启动 goroutines 运行,彼此独立。处理它们是 goroutine 调度程序的责任和义务。
goroutine 是一个轻量级线程:它的成本比 OS 线程低很多,但仍然需要一些成本。新 goroutine 的初始堆栈是几 KB(大约 8KB),并根据需要增长/收缩。参见 Goroutines 8kb and windows OS thread 1 mb。
鉴于您在没有任何同步的情况下启动了 100,000 个 goroutine,很可能您将有 100,000 个 goroutine 运行ning 在它们中的任何一个完成之前。估计的内存需求为:
100,000 * 8KB = 800 MB
因此您的应用使用 884MB 的内存与估算值基本一致。