@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 то сильно увеличивается обьем использования озу, который по хорошему должен очищаться ос временем, но это не происходит. Кто знает как с этим бороться?
  • Вопрос задан
  • 352 просмотра
Пригласить эксперта
Ответы на вопрос 3
Zarom
@Zarom
Мастер на все руки из жопы
Все отлично с 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 не удалось воспроизвести такой резкий рост памяти.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы