free 内存的时候,内存是否会还给 OS 重新分配?

2017-11-24 10:35:19 +08:00
 jiang1234321

malloc 内存用于存放 TCP 连接收到的数据,在接收完成后,free 内存,结果在 top 和 free -m 指令的显示下,进程的内存并没有减少,反而随着连接的增加一直增加,free 的内存不会归还给 OS 吗?

5042 次点击
所在节点    Linux
26 条回复
3dwelcome
2017-11-24 16:14:28 +08:00
关于 top 里 virt 和 res 区别,想说几句。理解这个才能更好的测试数据。

前者是分配的内存,也就是 new/malloc 了多少,比如说 malloc 了 500M,那 virt 就是 500M.
后者是分配后,你实际使用的内存。比如 malloc 了 500M,但你代码里,只访问的前 50M 数据,那操作系统会很聪明的,只在物理内存里划分 50M 给你,剩下的就不占物理内存了,因为这部分你暂时没用到啊。所以 res 是 50M。

如果是有内存回收机制的,看 vmpeak/vmsize 也许不行,但纯 C++写的代码,是可以这样看的。
jiang1234321
2017-11-24 19:36:39 +08:00
@3dwelcome 多谢指导,再问一下,我启动程序的时候 top 看内存的时候 VIRT 直接到了 1523M,但是 RES 只有 15M,%MEM 也只有%0.8,这是什么原因?
jiang1234321
2017-11-24 19:37:37 +08:00
@3dwelcome
/proc/[id]/status 文件里面显示的是
VmPeak: 1559568 kB
VmSize: 1559568 kB
datocp
2017-11-25 07:43:57 +08:00
当年在 ddwrt 只有 ralink 的设备通过 echo drop_cache 使这个 32M 内存的 dlink600 具备无限回复内存的能力。而同样版本针对 tplink wa701 的只会越用越少,所以针对这种设备直接每天定时重启,因为过低的内存至少已知会导致 dnsmasq 崩溃。
wanderer
2017-11-26 01:17:26 +08:00
madvise()
a32b88z
2017-11-27 22:11:19 +08:00
这种问题,还是不要探究的好。

计算机专业的操作系统专业书可以看看了解下原理,至于你真的要完全搞明白 Linux 和其他 OS 是怎样管理内存的,没这必要,也不是普通人随随便便就能搞明白的。就算搞明白了对你也没什么用。

你只要知道操作系统自己会「智能」管理内存就行了。如果你自己开发程序,特别是 c、c++之类的,特别注意不要 leak 内存就 ok.

如果是 linux 系统管理,把重点放在观察 ps 命令里面那个 rss。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/409135

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX