АМНЕЗИЯ

Спецвыпуск Xakep, номер #022, стр. 022-066-1


как правильно чистить память

Карен Казарьян aka Kirion (kirion@spez.fatal.ru)

Ну что ж, взяли в руки сковородку, хорошенько прицелились по голове... процесс очистки памяти начался :).

Как же нам увеличить количество свободной памяти? Я знаю два приемлемых способа. Первый: съездить на "Савеловский" и прикупить пару модулей (благо память опять подешевела). Я так и сделаю, когда мне заплатят за эту статью :).

Любой программер знает: освобождение занимаемой памяти, уничтожение созданных объектов - это то, что называется "хороший тон" в программировании.

Эх, где же эти дни, когда я с радостью слушал продвинутых товарищей, удивлялся всем новым фичам, избавлялся от ламерских заблуждений... Ностальгия, понимаешь :). Дык вот, однажды ко мне пришел знакомый и принес новую прогу: "Зашибись, прикинь, она память чистит!". Далее последовал резонный вопрос: от чего же она ее чистит? Ответом было что-то вроде: "Ну... от мусора разного... типа... в общем..." :). Меня это как-то не устроило, и я стал рыть инфу. Получив еще пяток похожих объяснений от друзей и пару десятков в Инете, я уж было сдался, но попался один чел, который начал рассказывать что-то про dll и выделение памяти (именно так я и сдружился с Киром :) - прим. Дронича). С него все и началось. Прошло время, пришел опыт и понимание, хотя полной ясности нет до сих пор. Но я надеюсь, что эта статья будет тебе полезна, даже если ты давно пользуешься прогами-чистильщиками. Ну что ж, взяли в руки сковородку, хорошенько прицелились по голове... процесс очистки памяти начался :).

ТАРАКАНЫ В ГОЛОВЕ

Почему же забивается память? Причин на самом деле несколько, и все они имеют разную значимость. dll'ки, например, действительно занимают много оперативки. И сделано это вроде как на благо юзера: часть функций программы оформляется в виде библиотеки dll, тогда сама программа служит как бы оболочкой для вызова этих функций. Так повышается быстродействие, особенно когда несколько программ используют одну и ту же библиотеку. После закрытия программы dll'ки еще какое-то время висят в памяти. Это делается для того, чтобы ускорить повторный запуск программы. На самом деле, это достаточно хороший механизм, если постоянно выгружать все неиспользуемые dll, скорость работы заметно уменьшится. Зато памяти будет много :). Так что тут необходим критерий, по которому они будут выгружаться, например, частота или время последнего использования.

Другая причина - кривые руки программистов. Любой кодер знает: освобождение занимаемой памяти и уничтожение созданных объектов - это "хороший тон" в программировании. Конечно, винда сама должна освобождать выделенную программам память, но... мусор все равно остается. Угадай, высвободится ли память, если программа была завершена аварийно (aka вылетела)? Вот и я так думаю... Не забудь о буфере обмена, он тоже занимает место в оперативе. А еще кэш. Несмотря на всю полезность, он тоже может забивать память (только при динамическом распределении). А теперь самое главное. Ты знаешь, почему фрагментируется диск? Правильно, потому что запись идет в первое попавшееся место. И своп (который еще называют виртуальной памятью) тоже фрагментируется, потому что части из памяти выгружаются в него как попало. Понял главную беду? Оперативка тоже фрагментируется! На скорость это влияет отнюдь не положительно. Ну что, давай найдем помощников в нашей пламенной борьбе за свободу памяти!

Содержание  Вперед на стр. 022-066-2