free()没有释放嵌入式linux中的内存。

时间:2014-01-29 14:28:20

标签: c free embedded-linux

我在嵌入式Linux中使用malloc()分配内存(大约10 MB)。并检查了空闲内存它是67080 kB但是即使在使用free()释放它之后它仍然是相同的。只有在应用程序终止后,内存才会再次可用。 free()不会将释放的内存提供给系统,如果可以的话,如何使其可用。

4 个答案:

答案 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()调用将内存返回到堆,它们被标记为空闲,但它们仍然是进程内存的一部分。

如果你想要内存释放将页面返回到系统,你必须编写自己的内存管理器,但请记住,它只能在正确的条件下完全释放内存:它取决于应用程序的行为,无论您的分配和解除分配是否跨越页面边界和干净地去片段等等。您需要了解应用程序的内存分配行为,以了解这是否会带来任何好处。