Я страдал от большой утечки памяти в одном из моих приложений: мой компьютер работал очень медленно, когда бы ни происходила утечка.Прежде чем исправить утечку, я хотел бы понять, почему это происходит.
Возьмем, к примеру, следующий небольшой код C ++ с утечкой:
size_t size = 1024 * 1024 * 1024;
char* buf = new char[size];
std::fill_n(buf, size, 'o');
std::string pause;
std::getline(std::cin, pause);
Из моего понимания виртуальной памятидисковые кеши и т. д., я ожидаю, что, хотя приведенный выше код ожидает ввода пользователя в последней строке, его 1-гигабайтный буфер больше не используется, поэтому операционная система должна постепенно поменять его на диск и «забыть» о нем,Я (пользователь) некоторое время страдал бы от замедления, но через некоторое время все нормализовалось бы.
Это не то, что происходит в моей системе (Windows XP, 32-разрядная, с 2 ГБ ОЗУ).).Когда я запускаю приведенный выше код (дважды, в 2 отдельных cmd
окнах, чтобы тратить всю доступную память), я чувствую сильное замедление работы моей системы;через несколько минут он становится лучше, но не приближается к максимальной производительности.Система возвращается в нормальное состояние после того, как я завершаю утечку «приложений».
Просто чтобы показать некоторые цифры, я использовал компиляцию некоторого исходного кода в качестве теста производительности.Я скомпилировал его несколько раз подряд, чтобы выполнить несколько измерений (в секундах).
- До утечки: 14, 2, 2, 3, 2, ...
- Послеутечка: 183, 40, 9, 7, 9, ...
- После закрытия утечки "приложений": 12, 2, 2, ...
Замедлениеиз 3х, где я бы не ожидал ни одного.Как это можно объяснить?