Will malloc implementations return free-ed memory back to the system?
free, glibc, malloc, mmap, tcmalloc
Solution
The following analysis applies only to glibc (based on the `ptmalloc2` algorithm). There are certain options that seem helpful to return the freed memory back to the system:
mallopt() (defined in `malloc.h`) does provide an option to set the trim threshold value using one of the parameter option `M_TRIM_THRESHOLD`, this indicates the minimum amount of free memory (in bytes) allowed at the top of the data segment. If the amount falls below this threshold, glibc invokes `brk()` to give back memory to the kernel.
The default value of `M_TRIM_THRESHOLD` in Linux is set to 128K, setting a smaller value might save space.
The same behavior could be achieved by setting trim threshold value in the environment variable `MALLOC_TRIM_THRESHOLD_`, with no source changes absolutely.
However, preliminary test programs run using `M_TRIM_THRESHOLD` has shown that even though the memory allocated by `malloc` does return to the system, the remaining portion of the actual chunk of memory (the arena) initially requested via `brk()` tends to be retained.
It is possible to trim the memory arena and give any unused memory back to the system by calling `malloc_trim(pad)` (defined in `malloc.h`). This function resizes the data segment, leaving at least `pad` bytes at the end of it and failing if less than one page worth of bytes can be freed. Segment size is always a multiple of one page, which is 4,096 bytes on i386.
The implementation of this modified behavior of `free()` using `malloc_trim` could be done using the malloc hook functionality. This would not require any source code changes to the core glibc library.
Using `madvise()` system call inside the free implementation of `glibc`.
Problem
I have a long-living application with frequent memory allocation-deallocation. Will any `malloc` implementation return freed memory back to the system? What is, in this respect, the behavior of: - ptmalloc 1, 2 (glibc default) or 3 - dlmalloc - tcmalloc (google threaded malloc) - solaris 10-11 default malloc and mtmalloc - FreeBSD 8 default malloc (jemalloc) - Hoard malloc? Update If I have an application whose memory consumption can be very different in daytime and nighttime (e.g.), can I force any of `malloc`'s to return freed memory to the system? Without such return freed memory will be swapped out and in many times, but such memory contains only garbage.