Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Утечка или кэширование вызова malloc


Автор: null56 9.3.2010, 15:48
Всем привет
Хотел поинтересоваться особенностью системных вызовов выделения и освобождения памяти
Код

void *malloc(
   size_t size 
);

void free( 
   void *memblock 
);


Написал небольшой пример, результат которого меня заинтересовал
Код

    for (int i = 50; i < 65; i++)
    {
        __test_Heap(i);
    }
.................................................
void __test_Heap(int i)
{
    void * ptr = malloc(79788659 + i * 597889);
    free(ptr);
}

По русски....
в цикле выделяем участки памяти произвольного размера и тут же освобождаем этот участок (размеры памяти выделяется довольно большие ~ 80 мегабайт и больше)
Что меня насторожило: размер занимаемой программой памяти после отработки этого цикла вырос с 848 килобайт до 1068 килобайт...
Хорошо, я предположил, что операционка начинает кешировать выделенные участки памяти для возможных повторных обращений, чем больше было запрошено памяти, тем больше этот кеш и тем больше приложение занимает памяти

Но затем я дополнил программку другим циклом
Код

    for (int i = 1000; i < 55500; i+=5000)
    {
        __test_heap_page(i);
    }
................
void __test_heap_page(int i)
{
    int pages_num = i / 4096;
    void * ptr = malloc(pages_num * 4096);
    free(ptr);
}

тут уже выделялись участки памяти по страницам, но заметно меньшего размера и ВСЁ РАВНО РАЗМЕР ИСПОЛНЯЕМОГО ПРИЛОЖЕНИЯ ВЫРОС НА НЕСКОЛЬКО КИЛОБАЙТ

Вопрос:
1) подскажите пожалуйста, с чем связано это увеличение памяти?
2) почему моя теория "о наибольшем участке" неверна?
3) можно ли как - нибудь решить это проблему из режима пользователя?

ЗЫ: если нужно что - то почитать, направьте пожалуйста

Заранее благодарен за помощь

Автор: GremlinProg 9.3.2010, 16:17
Цитата(null56 @  9.3.2010,  17:48 Найти цитируемый пост)
РАЗМЕР ИСПОЛНЯЕМОГО ПРИЛОЖЕНИЯ ВЫРОС НА НЕСКОЛЬКО КИЛОБАЙТ

полагаю, опечатка, или что-то в этом роде

напрямую malloc не влияет на память программы, если мы конечно об одном и том же говорим,
я склоняюсь к тому, что ты имеешь ввиду столбик "Память" в диспетчере задач

это просто индикатор физически отображенной памяти (текущий уровень в working set),
которая в принципе зависит от интенсивности обращений к участку и в общем случае, максимальный и минимальный размер такого отображения заключен в небольшом диапазоне: ~30 страниц, если память мне не изменяет (можно эти параметры конечно и менять, но уже с соответствующими правами администратора, а по-умолчанию, для простых смертных эти права выключены)

кэш на то и нужен, что позволяет на ограниченном "быстом" ресурсе (в окне) просматривать "медленные", но большие,

в одном случае - просто для покрытия всего адресного пространства, сколь велико бы оно ни было,
а в другом - для возможности оперативного переключения таких ресурсов (многозадачность)

Автор: null56 9.3.2010, 17:57
Цитата(GremlinProg @  9.3.2010,  16:17 Найти цитируемый пост)
полагаю, опечатка, или что-то в этом роде

да, извиняюсь... Имел в виду физическую память, размер которого отображает диспетчер задач

Цитата(GremlinProg @  9.3.2010,  16:17 Найти цитируемый пост)
я склоняюсь к тому, что ты имеешь ввиду столбик "Память" в диспетчере задач

да, я имею в виду его


GremlinProg, то есть этот параметр не несет за собой реальной информации об использовании памяти и рано или поздно он освободит её?

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

Автор: Comm 9.3.2010, 18:08
Советую почитать..очень хороший цикл статей про память
http://wasm.ru/article.php?article=1021020

Автор: GremlinProg 9.3.2010, 23:33
Цитата(null56 @  9.3.2010,  19:57 Найти цитируемый пост)
то есть этот параметр не несет за собой реальной информации об использовании памяти и рано или поздно он освободит её?

для программиста, в сегодняшнем понимании - нет не несет, если опираться на то, что он оперирует виртуальной, а не физической памятью
Цитата(null56 @  9.3.2010,  19:57 Найти цитируемый пост)
пишу приложение, которое должно работать длительное время. если это приложение потихоньку будет отжирать физической памяти, то через некоторое время это будет уже слишком накладно

довольно туманная формулировка, но если переживаешь именно за утечки памяти (memory leaks), то можно пользоваться довольно удобной утилитой: _CrtDumpMemoryLeaks, как раз для malloc, free, new, delete и т.п.: http://www.google.ru/search?q=CRT+memory+leaks

Автор: null56 10.3.2010, 22:01
GremlinProg, ну суть в чем.... Я тему зовел из - за этой колонки диспетчера задач с физической памятью... Резервирую блоки(malloc), освобождаю(free), но в этой колонке, после освобождениея памяти, размер медленно, но верно разрастается по сравнению с только что запущенным приложением... это насторожило
GremlinProg, спасибо за дебагер и советы

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)