@calculator212

Почему не получается освободить память в программе?

В общем не могу до конца разобраться как работает освобождение памяти. Я сначала забиваю память массивом на несколько мегабайт, потом очищаю его и вызываю GC, но размер выделенной памяти остается таким же. Я прочитал ответ на похожий вопрос здесь, но я так и не понял если Программа займет несколько гигабайт и освободит их таким образом, сможет ли другая программа при необходимости использовать эту память?
package main

import (
	"fmt"
	"runtime"
	"time"
)

func fillA()[]int{
	a := make([]int, 999999)
	for i := 0; i < 999999;i++ {
		a[i]=i
	}
	return a
}

func main() {

	PrintMemUsage()

	var overall [][]int
	for i := 0; i<4; i++ {


		overall = append(overall, fillA())

		// Print our memory usage at each interval
		PrintMemUsage()
		time.Sleep(time.Second*1)
	}

	// Clear our memory and print usage, unless the GC has run 'Alloc' will remain the same
	overall = nil
	PrintMemUsage()
	fmt.Println("nil")
	time.Sleep(time.Second*5)
	// Force GC to clear up, should see a memory drop
	runtime.GC()
	fmt.Println("nil 2")
	time.Sleep(time.Second*5)
	PrintMemUsage()
}

func PrintMemUsage() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
}

func bToMb(b uint64) uint64 {
	return b / 1024 / 1024
}
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
https://golang.org/doc/go1.12#runtime
Там можно прочитать про MADV_FREE.
Т.е. поведение по умолчанию освобождает память, но ядро не забирает освободившуюся память, если в ней нет необходимости. Предлагаю провести тест отключив этот флаг. В таком случае, как я полагаю, память будет возвращена немедленно.

Я не знаю деталей того, зачем вам понадобилось оптимизировать работу памяти. Я бы не приступал к этому процессу без конкретных причин.
Этот флаг скажется на производительности, поэтому если память не нужна хосту немедленно, не стоит её возвращать принудительно.
Следует мониторить метрики хоста и приложения, иметь оповещения на отклонения от нормы и только в случаях отклонения приступать к оптимизации работы компонентов приложения и ос.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы