Linux用户进程如何释放内存?
从图中可以看出,进程堆并不是直接基于Linux内核的内存分配策略,而是基于glibc的堆管理策略(即glibc的动态内存分配策略),堆管理是由glibc进行的。所以我们打免费电话给mal
Linux进程使用内存的基本过程:
从图中可以看出,进程堆并不是直接基于Linux内核的内存分配策略,而是基于glibc的堆管理策略(即glibc的动态内存分配策略),堆管理是由glibc进行的。所以当我们调用free释放malloc获得的内存时,并不是直接释放给操作系统,而是也给了glibc的堆管理实体,而glibc为了优化用户任务的动态内存分配过程,会优化将实际物理内存返回给系统的策略。
它将从堆的最大线性地址开始,从后向前计算用户任务当前有多少空闲堆内存(直到它触及正在使用的堆内存地址),例如,在下图中:
它会认为有2048k的空闲内存,只有当该值大于某个threshold hold(2 . 3 . 6上的64k)时,它才会将内存返回给系统。中间未使用的内存不会被归还给系统,所以系统不可能重用这个物理内存页(我们假设系统没有交换区和交换文件),这意味着系统的内存会减少,除非释放之前的堆内存,glibc的堆管理器才有可能(只有可能)将这个内存归还给系统。