Утечка памяти в пакете net/http

Я недавно начал изучать Golang и решил написать на нем сервис-сборник языков программирования (серверная часть написана на Golang).

Небольшая заметка: сервис-сборник языков программирования - (в данном случае) это сервис, который является "библиотекой" языков программирования, где можно добавлять или удалять их (важно: это я не успел добавить).

Сервис создан, все работает, но меня не устраивает тот факт, что каждый переход на другой адрес (например, localhost:8080/langs?s=Kotlin или localhost:8080/langs?s=Clojure) стоит мне 100-300 КБ, и при этом память (ОЗУ) не освобождается "сборщиком" мусора Golang. Почему так? Сервис не использует сторонние библиотеки!

До переходов по адресам (синей стрелкой обозначен исполняемый файл сервера):

До перехода

После переходов по адресам:

После переходов

Интернет подсказывает, что для решения моей проблемы нужно профилировать код (net/http/pprof'ом). Однако я там ничего не понял.

Профилирование

Вот код:


package main

import (
    "encoding/json"
    "html/template"
    "net/http"
    "fmt"
    "strings"
    "path/filepath"
    "os"
)

type Language struct {
    Company string `json:"company"`
    Name    string `json:"name"`
    Type    string `json:"type"`
    WhereUsed   []string `json:"whereused"`
    TypeCasting string `json:"type_casting"`
    Color string `json:"color"`
}

func Home(writer http.ResponseWriter, request *http.Request) {
    dir, _ := os.ReadDir("languages")
    DataArray := []string{}
    for _, data := range dir {
        DataArray = append(DataArray, strings.ReplaceAll(data.Name(),filepath.Ext(data.Name()),""))
    }
    tmp, _ := template.ParseFiles("index.html")
    tmp.Execute(writer, DataArray)
}

func GetItem(writer http.ResponseWriter, request *http.Request) {
    var Lang string = request.URL.Query().Get("s")
    js_not_ready_yet, _ := os.ReadFile(fmt.Sprintf("./languages/%s.json",Lang))
    var About Language
    _ = json.Unmarshal(js_not_ready_yet,&About)
    tmp,_ := template.ParseFiles("template.html")
    tmp.Execute(writer,About)
}

func main() {
    http.HandleFunc("/lang", GetItem)
    http.HandleFunc("/",Home)
    http.ListenAndServe(":8080",nil)
}

Пожалуйста, укажите на мою ошибку. Я очень не хочу верить в то, что это является особенностью языка.


Ответы (0 шт):