Retornando a memória alocada dinamicamente de volta ao SO sem encerrar o programa
Estou trabalhando em um programa em que estou usando uma quantidade grande, mas limitada de memória. A memória é alocada e liberada no tempo de execução em diferentes threads. No entanto, notei que o uso de memória do programa não permaneceria dentro dos limites especificados. Aumentaria com o passar do tempo. Eu escrevi o seguinte programa de amostra para verificar se a memória está sendo liberada de volta para o sistema operacional. Metade da memória alocada foi liberada para verificar se o uso da memória diminuiu.
int main()
{
char *p[COUNT];
for(int i = 0; i < COUNT; i++)
{
p[i] = new char[1048576];
memset (p[i], 0, 1048576);
printf("%p\n", p[i]);
}
printf("done allocating ... \n");
sleep(10);
printf("Freeing\n");
for(int i; i < COUNT; i++)
{
delete[] p[i];
}
while(1)
sleep(1);
}
Depois de executar o programa, parecia que o sistema operacional não recuperaria as páginas liberadas. O uso da memória permanece o mesmo do comando "top" no linux, após a alocação e a liberação. Simplesmente marca as páginas como livres para reutilização pelo mesmo programa. No meu programa, malloc e free estão sendo executados em diferentes threads. Isso coloca um problema de gerenciamento de memória quando o malloc é chamado com muito mais frequência do que livre e o segmento de dados do processo cresce muito, fazendo com que o sistema operacional troque de página em disco. Isso torna o programa e o SO lento e sem resposta. Existe alguma maneira de o sistema operacional recuperar a memória liberada?