Почему утечка памяти не продолжается после пика? - PullRequest
1 голос
/ 02 апреля 2012

Я создал преднамеренную утечку памяти, чтобы продемонстрировать точку зрения людям, которые вскоре будут изучать указатели.

int main()
{
    while (1)
    {
        int *a = new int [2];
        //delete [] a;
    }
}

Если это выполняется без кода с комментариями, память остается низкой и не увеличивается,как и ожидалось.Однако, если это выполняется как есть, то на машине с 2 ГБ ОЗУ использование памяти быстро возрастает примерно до 1,5 ГБ или того, что не используется системой.Однако, как только он достигнет этой точки, загрузка ЦП (которая ранее была максимальной) значительно снизилась, а также использование памяти, примерно до 100 МБ.

Что именно вызвало это промежуточное действие (если есть что-то более конкретное, чем «Windows», это было бы замечательно), и почему программа не загружает ЦП, который она будет зацикливать, но также не завершает работу?Кажется, что он застрял между концом цикла и концом основного.

Windows XP, GCC, MinGW.

Ответы [ 6 ]

4 голосов
/ 02 апреля 2012

Вероятно, ваш код распределяет всю доступную физическую память. Когда он достигает этого предела, система начинает выделять для него место в файле подкачки. Это означает, что он (почти) постоянно ожидает на диске, поэтому его загрузка ЦП падает (почти) до нуля.

Система может легко отслеживать тот факт, что она фактически никогда не записывает в память, которую она выделяет, поэтому, когда она должна быть сохранена в файле подкачки, она просто сделает небольшую запись в основном говоря, что «процесс X имеет N байт неинициализированного хранилища» вместо того, чтобы фактически копировать все данные на жесткий диск (но я не уверен в этом, и это вполне может зависеть от конкретной системы, которую вы используете).

1 голос
/ 02 апреля 2012

Перефразируя Иниго Монтойю: «Я не думаю, что это означает то, что вы думаете, что значит».Диспетчер задач Windows не отображает данные об использовании памяти, которые вы ищете.

В столбце «Mem Usge» отображается информация, связанная с размером рабочего набора (или резидентного набора) процесса.То есть «Использование памяти» отображает число, относящееся к объему физической памяти, выделенной в данный момент вашему процессу.

В столбце «Размер виртуальной машины» отображается число, совершенно не относящееся к подсистеме виртуальной памяти (фактически эторазмер частных куч, выделенных процессом.

Попробуйте использовать другой инструмент для визуального использования виртуальной памяти. Я предлагаю Process Explorer .

0 голосов
/ 02 апреля 2012

Несколько вещей: во-первых, если вы выделяете только 2 int с за раз, может пройти несколько часов, прежде чем вы заметите, что из-за этого увеличивается общее использование памяти.И во-вторых, во многих системах распределение не фиксируется, пока вы фактически не получите доступ к памяти;адресное пространство может быть зарезервировано, но у вас на самом деле нет памяти (и программа потерпит крах, если вы попытаетесь получить доступ к памяти, а ее нет).

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

0 голосов
/ 02 апреля 2012

Столбец «Использование памяти» диспетчера задач, вероятно, является «рабочим набором», как объясняется несколькими ответами на этот вопрос , хотя, если честно, я все еще запутываюсь, как диспетчер задач относится к память, как она меняется от версии к версии. Это значение увеличивается / уменьшается, так как вы, очевидно, не используете много памяти в любой момент времени. Если вы посмотрите на «Размер виртуальной машины», то увидите, что он постоянно увеличивается, пока не случится что-то плохое.

Вы также можете дать Process Explorer попытку, которую легко понять, как она отображает вещи.

0 голосов
/ 02 апреля 2012

Столбец Памяти по умолчанию в диспетчере задач XP - это размер рабочего набора процесса (объем физической памяти, выделенной этому процессу), а не фактическое использование памяти.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684891%28v=vs.85%29.aspx

http://blogs.msdn.com/b/salvapatuel/archive/2007/10/13/memory-working-set-explored.aspx

0 голосов
/ 02 апреля 2012

Я полагаю, что когда программа исчерпывает доступную физическую память, она начинает использовать дисковую (виртуальную) память, и она становится настолько медленной, что кажется неактивной.Попробуйте добавить визуализацию скорости:

int counter = 0;
while (1)
{
    int *a = new int [2];
    ++counter;
    if (counter % 1000000 == 0)
        std::cout << counter << '\n'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...