考虑以下:
$ dmesg | grep 'Memory:'
[ 0.000000] Memory: 8009456K/8272776K available (8474K kernel code, 1293K rwdata, 3984K rodata, 1488K init, 1316K bss, 263320K reserved, 0K cma-reserved)
实际上,这表明在启动时系统有 8009456K 可用于任务(减去保留的内容)。然而,启动后free
报告vmstat
了一些非常奇怪的事情
$ free -k ; vmstat -s | head -n 1
total used free shared buff/cache available
Mem: 8059880 2774996 2667600 394196 2617284 4529964
Swap: 1048572 412 1048160
8059880 K total memory
奇怪的是,已经启动的系统更多的可用内存,这在逻辑上似乎与人们的预期相反 - 在启动时应该运行更少的进程,因此应该有更多的可用内存。这怎么解释呢?
答案1
在启动过程中,以及在您提取的 dmseg 行之后的阶段,通常会释放一些内存。让我们通过我的电脑来看一下示例:
首先,我们稍微改变一下 dmesg 提取命令(已编辑):
$ dmesg | grep -i 'Memory:'
...[snip]...
[ 0.000000] Memory: 15829128K/16472972K available (8480K kernel code, 1294K rwdata, 3984K rodata, 1492K init, 1316K bss, 643844K reserved, 0K cma-reserved)
[ 0.009844] Freeing SMP alternatives memory: 32K
[ 0.868465] Freeing initrd memory: 37044K
[ 2.621648] Freeing unused kernel memory: 1492K
[ 2.624095] Freeing unused kernel memory: 1748K
[ 2.625334] Freeing unused kernel memory: 112K
注意上面摘要行后面的释放内存。将它们全部加起来,我得到总共应该有 15869556 个。现在让我们使用相同的命令检查一下:
$ free -k ; vmstat -s | head -n 1
total used free shared buff/cache available
Mem: 15869556 113352 15461820 9792 294384 15454760
Swap: 16472060 0 16472060
15869556 K total memory
请注意,预期总数恰好等于实际总数。