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.
The following analysis applies only to glibc (based on the
ptmalloc2algorithm).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 optionM_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 invokesbrk()to give back memory to the kernel.The default value of
M_TRIM_THRESHOLDin 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_THRESHOLDhas shown that even though the memory allocated bymallocdoes return to the system, the remaining portion of the actual chunk of memory (the arena) initially requested viabrk()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 inmalloc.h). This function resizes the data segment, leaving at leastpadbytes 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()usingmalloc_trimcould 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 ofglibc.