为什么简单的Go应用会消耗大量内存

Rah*_*abi -3 string memory-leaks go goroutine

这是一个非常简单的应用程序:

package main
import "fmt"
func main() {

    for i:= 0; i < 100000; i++ {
        go func (){
            fmt.Println("hello message.")
        }()
    }

    fmt.Scanln()
    fmt.Println("done")
}
Run Code Online (Sandbox Code Playgroud)

在Windows上运行应用程序后,并查看Windows任务管理器,我看到了以下状态:

进入应用状态

有人可以说为什么?

icz*_*cza 7

启动的goroutine可以同时运行,彼此独立。goroutine调度程序负责处理这些任务和职责。

goroutine是一个轻量级的线程:它的成本比OS线程低很多,但仍然要花一些钱。一个新的goroutine的初始堆栈为几个KB(大约8KB),并根据需要增加/缩小。请参阅Goroutines 8kb和Windows OS线程1 mb

假设您在没有任何同步的情况下启动了100,000个goroutine,那么很可能在您完成其中的100,000个goroutine之前,您将在其中运行它们。估计的内存需求为:

100,000 * 8KB = 800 MB
Run Code Online (Sandbox Code Playgroud)

因此,您使用884MB的应用几乎符合估算。