В общем не могу до конца разобраться как работает освобождение памяти. Я сначала забиваю память массивом на несколько мегабайт, потом очищаю его и вызываю 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
}