Сменна аллокатора памяти.
Оказывается, что реализация malloc в glibc выделяет память в куче с помощью brk/sbrk, т.е. одним большим связным куском. Эта куча может уменьшаться только с конца, освободить память в середине невозможно (не считая вызова madvise). Так что даже один байт в конце кучи не позволяет отдать память системе. И malloc размещает переменные в памяти по сути просто друг за другом. Это создаёт условия для такого явления, как фрагментация памяти.
Подробности тут (http://mr.himki.net/index-alloc.html)
Решение:
1. скачать http://mr.himki.net/OpenBSD_malloc_Linux.c
2. собрать
gcc -shared -fPIC -O2 OpenBSD_malloc_Linux.c -o malloc.so
3. запустить
LD_PRELOAD=/path/to/malloc.so firefox