Debian和Redhat的malloc()/free()行为不同

Debian和Redhat的malloc()/free()行为不同,c,linux,memory-management,malloc,C,Linux,Memory Management,Malloc,我有一个Linux应用程序(用C编写),它通过malloc()将大量内存(约6000万)分小块分配,然后释放内存(应用程序继续运行)。该内存不会返回到操作系统,而是一直分配给进程 现在,这里有趣的是,这种行为只发生在RedHat Linux和克隆(Fedora、Centos等)上,而在Debian系统上,在所有释放完成后,内存会返回操作系统 你知道为什么这两个内存之间会有差异,或者哪个设置可以控制它,等等吗?一些内存处理程序在需要内存之前不会将内存显示为空闲内存。相反,它让CPU做其他事情,然后

我有一个Linux应用程序(用C编写),它通过malloc()将大量内存(约6000万)分小块分配,然后释放内存(应用程序继续运行)。该内存不会返回到操作系统,而是一直分配给进程

现在,这里有趣的是,这种行为只发生在RedHat Linux和克隆(Fedora、Centos等)上,而在Debian系统上,在所有释放完成后,内存会返回操作系统


你知道为什么这两个内存之间会有差异,或者哪个设置可以控制它,等等吗?

一些内存处理程序在需要内存之前不会将内存显示为空闲内存。相反,它让CPU做其他事情,然后完成清理。如果您想确认这是真的,那么只需做一个简单的测试,在循环中分配和释放更多内存的次数要比内存可用的次数多。

一些内存处理程序在需要内存之前不会将内存表示为可用内存。相反,它让CPU做其他事情,然后完成清理。如果您想确认这是真的,那么只需做一个简单的测试,在循环中分配和释放更多内存的次数要比内存可用的次数多。

我不确定这两个系统为何会表现不同(可能是不同glibc的malloc实现不同)。但是,您应该能够通过以下调用对您的流程的全球策略施加一些控制:

mallopt(M_TRIM_THRESHOLD, bytes)
(详情请参见)

您也可以通过以下电话请求立即释放:

malloc_trim(bytes)

(见malloc.h)。我相信这两个电话都会失败,所以我认为你不能指望他们100%的时间都在工作。但是我的猜测是,如果你尝试它们,你会发现它们会有所不同。

我不确定为什么这两个系统的行为会不同(可能是malloc的不同实现与不同的glibc的不同)。但是,您应该能够通过以下调用对您的流程的全球策略施加一些控制:

mallopt(M_TRIM_THRESHOLD, bytes)
(详情请参见)

您也可以通过以下电话请求立即释放:

malloc_trim(bytes)

(见malloc.h)。我相信这两个电话都会失败,所以我认为你不能指望他们100%的时间都在工作。但我的猜测是,如果你尝试一下,你会发现它们会有所不同。

Glibc版本,好吗dpkg-l libc6,Red Hat上的
rpm-q glibc
(我想,我周围没有要检查的)。如果您正在运行Debian测试或“结束”,那么glibc已更改为eglibc。只有源程序包名称已更改-二进制程序包仍然命名为
libc6
。您可以再试一次,但调用mlockall()在分配之前,然后查看它们的行为是否与预期相同?请选择Glibc版本dpkg-l libc6,Red Hat上的
rpm-q glibc
(我想,我周围没有要检查的)。如果您正在运行Debian测试或“结束”,那么glibc已更改为eglibc。只有源程序包名称已更改-二进制程序包仍然命名为
libc6
。您可以再试一次,但调用mlockall()在分配之前,然后查看它们的行为是否与预期的相同?是的,我知道为什么libc不能立即释放内存。问题是为什么两个Linux系统的行为如此不同,是否有任何方法可以决定性地控制它?是的,我知道为什么libc不能立即释放内存。问题是为什么两个Linux系统的行为如此不同,是否有任何方法可以决定性地控制它?