我在嵌入式Linux中使用malloc()分配内存(大约10 MB)。并检查了空闲内存它是67080 kB但是即使在使用free()释放它之后它仍然是相同的。只有在应用程序终止后,内存才会再次可用。 free()不会将释放的内存提供给系统,如果可以的话,如何使其可用。
答案 0 :(得分:6)
free
是一个libc库调用。它将堆空间标记为可重用。它不保证将释放关联的虚拟映射。只有在您的操作系统发布了一个脏的虚拟映射之后,该内存才会在系统范围内再次释放。这只能在页面块中发生。
此外,如果您使用malloc
和家人分配内存并且没有使用它,那么在此之前它实际上并没有消耗物理内存 - 因此释放它将无能为力。
答案 1 :(得分:3)
free()不会使释放的内存可供系统使用。
不,通常不会。
malloc()通常通过低级sbrk()
或mmap()
调用从操作系统请求内存。一旦分配给应用程序,free()只会将内存返回到属于应用程序的内存池。也就是说,它不会返回到操作系统以便在另一个进程中使用。 (虽然在某些情况下会有一些启发式方法可以这样做。)
如果交换空间到位,这就不再是问题了,操作系统会更换未使用的应用程序内存,为额外的物理内存腾出空间。
如果是的话如何使它可用。
退出申请。
或者您需要编写自己的内存分配器来执行此操作。(在一般情况下,这并非易事,特别是如果您不想牺牲开销和速度)。
对于10MB的相对较大的单个部分,您可以简单地使用mmap()
请求匿名内存,当munmap()
该内存时,内存将被释放回操作系统。
答案 2 :(得分:3)
取自malloc 3手册页:
通常,malloc()从堆中分配内存,并调整 使用sbrk(2)根据需要填充堆的大小。分配块时 内存大于MMAP_THRESHOLD字节,glibc malloc() 实现将内存分配为私有匿名映射 使用mmap(2)。 MMAP_THRESHOLD默认为128 kB,但是 使用mallopt(3)进行调整
您可以尝试修改MMAP_THRESHOLD,以便通过使用malloc调用mmap。如果你这样做,免费保证通过mmap分配的内存将在你释放后立即返回系统。
答案 3 :(得分:1)
您的malloc()调用从系统获取内存,并维护堆数据结构以跟踪进程内的已用内存和可用内存。你的free()调用将内存返回到堆,它们被标记为空闲,但它们仍然是进程内存的一部分。
如果你想要内存释放将页面返回到系统,你必须编写自己的内存管理器,但请记住,它只能在正确的条件下完全释放内存:它取决于应用程序的行为,无论您的分配和解除分配是否跨越页面边界和干净地去片段等等。您需要了解应用程序的内存分配行为,以了解这是否会带来任何好处。