Программа работает по итерациям. В пределах одной итерации, заполняются некоторые структуры данных. Используется STL (string, map, vector и т. п.). Также используются потоки (пул из n штук по количеству ядер, каждый обрабатывает, как правило, по 1/n части какого-нибудь map-а). Между итерациями все основные структуры уничтожаются (остаётся небольшой объём данных). Как правило, между итерациями, размер RSS (используемой физической памяти) и VIRT (размер адресного пространства) не уменьшается или уменьшается очень незначительно. В некоторых случаях удавалось добиться, чтобы память отдавалась ОС, но я пока не разобрался, что на это влияет. Получается, что размер используемой памяти остаётся равным максимальному размеру, который требуется для одной итерации. Дело происходит под Linux (Ubuntu), amd64, gcc 4.3.
Вопросы:
— почему так происходит; в каких случаях, вообще, память должна возвращаться системе? (вариант с перезапуском программы не рассматриваем);
— можно ли добиться ожидаемого результата, если использовать другие аллокаторы (которые заменяют malloc), если да — то какие?
— можно ли добиться ожидаемого результата, если использовать другие аллокаторы для STL, если да, то какие, и в какие контейнеры их стоит ставить?