Почему простое приложение Go потребляет много памяти - PullRequest
0 голосов
/ 14 марта 2019

это очень простое приложение:

package main
import "fmt"
func main() {

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

    fmt.Scanln()
    fmt.Println("done")
}

после запуска приложения на окнах и просмотра диспетчера задач Windows Я видел это состояние:

go app state

кто-то может сказать почему?

1 Ответ

7 голосов
/ 14 марта 2019

Запущенные программы выполняются одновременно, независимо друг от друга.Обязанностью и обязанностью планировщика goroutine является их обработка.

Goroutine - это легковесный поток: он стоит намного меньше, чем поток ОС, но все же что-то стоит.Начальный стек для новой программы составляет пару килобайт (около 8 КБ) и увеличивается / уменьшается по мере необходимости.См. Goroutines 8kb и поток ОС Windows 1 МБ .

Учитывая, что вы запускаете 100 000 подпрограмм без какой-либо синхронизации, вполне может быть, что у вас будет 100 000 запущенных подпрограмм до завершения любой из них.Предполагаемые требования к памяти для этого будут:

100,000 * 8KB = 800 MB

Таким образом, ваше приложение, использующее 884 МБ, в значительной степени соответствует оценке.

...