go 内存为什么只增不减 runtime.MemStats.Sys

下面是写了给测试的demo。想问下内存为什么只增不减呢。
for 循环一遍之后无用的变量不应该释放内存么。
还有不理解的地方是整个程序结束前为什么内存还是没有下降。

package main

import (
    "fmt"
    "runtime"
)

func main() {

    Mem(fmt.Sprintf("for start"))
    for i := 0; i < 20; i++ {
        nums := []string{"1", "2", "3", "4", "567"}
        nums = append(nums, "5")
        Mem(fmt.Sprintf("for%d", i))
        runtime.GC()
    }
    Mem(fmt.Sprintf("for end"))
}
func Mem(msg string) {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    fmt.Println(msg, m.Sys)
}

运行结果:

for start 6443144
for0 6443144
for1 6770824
for2 6836360
for3 6836360
for4 6836360
for5 6836360
for6 6836360
for7 6836360
for8 6836360
for9 6836360
for10 6836360
for11 6836360
for12 6836360
for13 6836360
for14 6836360
for15 6836360
for16 6836360
for17 6836360
for18 7098504
for19 7098504
for end 7098504
讨论数量: 1

sys 不是实际占用的物理内存大小, 是向操作系统申请的所有虚拟内存空间大小之和,等同于 XXX_sys + XXX_sys。 虚拟内存只保留了和物理内存的页表映射,不代表实际内存,go也不会去做这个映射的解除,所以这个值不会掉。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!