STL не освобождает память от системного уровня - PullRequest
0 голосов
/ 11 декабря 2018

Как я знаю, STL имеет автоматическое управление памятью.Но когда я использую что-то вроде top или ps -aux, чтобы показать использование памяти процессом, это показывает, что даже объект STL находится вне области видимости, эта память все еще одержима процессом.

Вотпример:

void run()
{
    map<int, int> a;
    for(int i = 0; i < 1000000; i++)
    { 
        a[i] =  i;
    } // 64376K memory used by process
}

int main()
{
    run();
    sleep(5); // still 64376 memory used
    map<int, int> a;
    for(int i = 0; i < 1000000; i++)
    { 
        a[i] =  i;
    } // still 64376 memory used
    return 0;
}

Процесс обладает памятью 64376 КБ в run() и память не освобождается после функции run().Но эта память, кажется, используется вторым map.

После того, как я использую valgrind --tool=massif, чтобы проверить, что произошло, я получил нормальный результат.

enter image description here

Итак, вот мой вопрос

  1. , почему тренды памяти процесса не совпадают с кодом и valgrind
  2. Как разделяются различные объекты STLтакая же выделенная память.

1 Ответ

0 голосов
/ 11 декабря 2018

Это совершенно нормально.Вот как работают операционные системы.Если бы они тратили все свое время на восстановление крошечных порций памяти из крошечных процессов, они бы никогда больше ничего не делали.

Вам просто нужно верить, что их сложные алгоритмы знают, что делают, чтобы добиться максимальной производительности дляваша система.

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

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

Если бы мы забыли о кэшировании и виртуальной памяти и тому подобном, даже простое практическое правило можно обобщить следующим образом: освобождение памяти из вашей программы говорит ОС, что она может вернуть ее;это не значит, что ОС должна вернуть его назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...