же
package main
import (
"bufio"
"fmt"
"github.com/pkg/profile"
"os"
)
func main() {
defer profile.Start(profile.MemProfile).Stop()
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
go func(line string) {
fmt.Println(line)
}(line)
}
err := scanner.Err()
if err != nil {
fmt.Printf("Scanner ioerror: %v.", err)
}
}
Запускаем такой код, подаем 100000 строк на вход и получаем RSS в 490М, причем память не отдается системе.
Обьясните как так, потэнциально при долгой работе утечка ?
ну 1 горутина примерно 4-4.5 кб, если не ошибаюсь значит 400-450мб у тебя цена горутин
1 - горутины. 2 - Помимо горутин много уходит на аллокацию новых стрингов. Поскольку они уходят в горутины, то размещаются в куче. sync.Pool для строк - значительно уменьшил потребление памяти.
Обсуждают сегодня