Написал веб-сервер на Го
Принимает GET параметр и собирает большой массив
package main
import (
"net/http"
"fmt"
_ "net/http/pprof"
"strings"
)
func one(w http.ResponseWriter, r *http.Request){
s := r.URL.Query().Get("s")
array := []string{}
for i:=0; i<10000; i++{
new_s := strings.Repeat(s,1000) // Если вынести за пределы цикла - потребляет меньше памяти (35мб) но все равно ее не освобождает
array = append(array, new_s)
}
w.Write([]byte("ok"))
}
func main(){
http.HandleFunc("/one", one)
fmt.Println("ready")
server := &http.Server{Addr: ":8008"}
server.ListenAndServe();
}
При старте занимает
6 мб Озу.
При запуске:
ab -n 1000 -c 100 "http://localhost:8008/"
- потребление памяти вырастает до 10мб
ab -n 1000 -c 1 "http://localhost:8008/one?s=1"
~ 30мб
ab -n 1000 -c 100 "http://localhost:8008/one?s=1"
~ 800мб
И во всех случаях она никак не освобождается. Процесс так и продолжает занимать много памяти
Кто подскажет, что тут не так? А то я не понимаю, почему го так много занимает памяти и не освобождает ее даже когда запрос клиента обработан?