在linux上你会发现明明我的内存都释放了但是进程占用的内存还是没降下来,而在windows上就没有这种情况。这涉及到linux上内存分配原理(参考)。
在linux系统下,一块内存被C的free函数或者C++的delete函数显式释放后,释放掉的内存不一定马上交还给系统。简单地说,系统通过动态分配给进程的内存分为两部分: mmap和brk。mmap在进程的虚拟地址空间中找出一块空闲区域分配给进程,释放后马上归还给系统; brk在进程数据段内找到一块空闲区域给系统,是通过push _edata栈顶指针实现。两种情况下都不会直接分配物理内存,只有在访问虚拟空间地址产生缺页中断的时候才会建立虚拟地址与内存地址间的映射。brk分配的内存在被释放后,如果堆栈高地址的内存块没有释放,那么低地址内存块就算被free也不会归还给系统。这就是明明被显式free掉的内存仍然不在系统空闲内存列表中,而进程什么内存泄露都查不出来的原因。
解决DVP内存使用上涨的方法是强制系统在free掉buffer后将堆栈栈顶的内存区域强制归还给系统(称为一次内存紧缩)。为此,使用函数malloc_trim(0)可以做到,这个函数是线程安全的(具体参考)
如果你要更好的优化linux内存需要用到mallopt这个函数(具体参考)
malloc_trim(0)
你值得拥有