@Skelman

Почему в golang не очищается память?

Начал недавно изучать golang и столкнулся с не совсем понятным для меня поведением слайсом структур.
Вот к примеру простой код

package main

import "github.com/gin-gonic/gin"

type user struct {
	ID   int
	Name string
}

func main() {

	findUser()
	r := gin.New()
	r.Use(gin.Recovery())
	r.GET("/ping", func(c *gin.Context) {
		a := findUser()
		c.JSON(200, gin.H{
			"message": a,
		})
	})
	r.Run()
}

func findUser() int {
	var users []*user
	for i := 0; i < 100000; i++ {
		users = append(users, &user{
			ID:   i,
			Name: "ololo",
		})
	}
	length := len(users)
	var u []*user
	users = u
	return length
}


И каждый раз, когда я захожу на localhost:8080/ping то сильно увеличивается обьем использования озу, который по хорошему должен очищаться ос временем, но это не происходит. Кто знает как с этим бороться?
  • Вопрос задан
  • 497 просмотров
Пригласить эксперта
Ответы на вопрос 3
Все отлично с GC в go. Память очищается, не возвращается системе, а переиспользуется программой до тех пор, пока в системе достаточно свободной памяти.

А это вообще что и зачем?
var u []*user
users = u
Ответ написан
yellow79
@yellow79
Senior Software Engineer
Память очищается GC, всё норм, можно не переживать. Просто то, что бы очищено, не возвращается в систему. По прошествии какого-то времеги гошечка вернёт эти данные обратно, нужно просто подождать. Может 10 минут, может час, может больше, это время ничем не регламентируется
Ответ написан
Во-первых, уменьшите количество аллокаций, сразу создавая слайс нужной длины.
Вместо var u []*user используйте users := make([]*user, 0, 100000)

Во-вторых, какая у вас версия го? Мне на 1.12.1 не удалось воспроизвести такой резкий рост памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Spectrum Екатеринбург
от 100 000 до 160 000 ₽
MillionAgents Москва
от 150 000 до 200 000 ₽
08 апр. 2020, в 00:40
15000 руб./за проект
07 апр. 2020, в 23:31
50000 руб./за проект