tcmalloc ReleaseFreeMemory () не освобождает память должным образом

Я использую tcmalloc в одном из моих приложений, в котором куча растет и уменьшается в очень большом количестве, очевидно, я столкнулся с проблемой, когда tcmalloc не освобождает память обратно в ОС. Теперь я попытался использовать API, чтобы сделать это с помощью MallocExtension::instance()->ReleaseFreeMemory();, Он работал нормально и освободил память. Но когда я продолжаю запускать процесс через некоторое время (скажем, 5 минут), память все еще увеличивается до исходного уровня (иногда больше). Странная вещь — приложение бездействует.

Вот мой код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "google/malloc_extension.h"
int main(int argc, char* argv[])
{

char** names;
printf("\nBefore starting the execution. Press enter to start.... \n");
getchar();
if (argc < 3)
{
printf("Usage: ./a.out <numTimes> <allocsize>\n");
exit(1);
}
int numTimes = atoi(argv[1]);
int allocSize = atoi(argv[2]);
names = (char**) malloc(numTimes * sizeof(char*));
for (int i = 0; i < numTimes; i++)
{
names[i] = (char*)malloc(allocSize);
}
printf("\nDone with the execution. Press enter to free the memory.... \n");
getchar();
for (int i = 0; i < numTimes; i++)
{
free(names[i]);
}
free(names);
printf("\nDone with the freeing. Press enter to release the memory.... \n");
getchar();
MallocExtension::instance()->ReleaseFreeMemory();
printf("\nDone with the execution. Press enter to exit.... \n");
getchar();
return 0;
}./a.out 10000 30000

after release

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18823 sarath    20   0  332m 4568 1268 S  0.0  0.2   0:00.05 a.out

after sometimes(4-5 mins)

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18823 sarath    20   0  332m 129m 1268 S  0.0  6.5   0:00.05 a.out

Ценю любую помощь.

4

Решение

Вы можете попытаться включить malloc.h и обернуть malloc_stats () вокруг вашего вызова MallocExtension :: instance () -> ReleaseFreeMemory (), вот так ….

malloc_stats();
MallocExtension::instance()->ReleaseFreeMemory();
malloc_stats();

Вы должны увидеть что-то вроде этого:

До:

4997120 (    4.8 MiB) Bytes in page heap freelist
7434392 (    7.1 MiB) Actual memory used (physical + swap)
0 (    0.0 MiB) Bytes released to OS (aka unmapped)

После:

0 (    0.0 MiB) Bytes in page heap freelist
2437272 (    2.3 MiB) Actual memory used (physical + swap)
4997120 (    4.8 MiB) Bytes released to OS (aka unmapped)

Если ничего другого, это будет проверять, что память фактически освобождается из списка свободных страниц кучи страниц и теперь не отображена.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]