Описание тега memory-leaks
Введение
Утечка памяти происходит, когда программе не удается освободить выделенную память, которую она больше не использует. Во многих случаях на память нельзя ссылаться, и поэтому она никогда не будет восстановлена для перераспределения. Даже в тех случаях, когда можно ссылаться на память, ее восстановление может быть вызвано другим кодом. Утечки памяти особенно важны для разработчиков, поскольку их может быть чрезвычайно сложно отладить. В коде существует множество устоявшихся практик, специально разработанных для предотвращения утечек памяти.
Влияние утечек памяти
Каждая запущенная программа или приложение, независимо от среды, должна иметь выделенную для себя память, чтобы (по крайней мере временно) хранить свои данные и даже запускать свой код. Когда запускается программа с одной или несколькими утечками памяти, эта память будет игнорироваться системой, потому что система считает, что она используется, либо потому, что ей было сказано, либо потому, что требования к мертвой памяти не были выполнены. В зависимости от интенсивности и правдивости утечки это может быстро привести к тому, что система не сможет выделить память для других программ (даже для себя), что приведет к снижению производительности и непреднамеренным сбоям. В некоторых менее современных средах утечки памяти могут вызвать неожиданный сбой системы, что может привести к другим проблемам.
Среды с управляемой памятью (намеренно общие)
Среда с управляемой памятью - это среда, в которой создается вспомогательная среда для прямого мониторинга использования памяти, ее распределения, восстановления и перераспределения для программ, которые в ней выполняются. Для многих разработчиков это желательно, потому что это позволяет разработчикам создавать свои приложения и быть уверенным в том, что надлежащий объем памяти будет выделяться, когда это необходимо, и освобождаться, когда нет. Наиболее распространенной из них является среда выполнения, которая позволяет (а иногда и заставляет) программы запускаться в своем пространстве памяти. На самом деле диспетчер памяти - это просто еще одна программа, работающая от имени системы, которую часто называют сборщиком мусора.
Сборщики мусора могут быть специфичными для системы или даже для конкретного языка, требуя, чтобы программы, написанные на определенном языке, всегда выполнялись в области управляемой памяти. Поскольку диспетчер памяти является программой, он ищет индикаторы неиспользуемой памяти, чтобы определить, требуется ли восстановление. У каждого диспетчера памяти есть определенные критерии, которые он проверяет, наиболее распространенный из которых - когда ни программа, ни какой-либо ее код не ссылаются (через указатель) на конкретный блок памяти. Безотносительно семантики конкретной среды наиболее распространенная практика предотвращения утечек: Удалите все ссылки, которые больше не используются. Это означает либо а) освободить все указатели, либо б) установить явные ссылки на объекты наnull
(в зависимости от языка).
Среды с неуправляемой памятью (намеренно общие)
Среда с неуправляемой памятью - это когда программа напрямую запрашивает память у системы и отвечает за освобождение самой памяти. Самый известный пример этого нативного кода на C или C++. В результате популярности этих языков,malloc()
стал ключевым показателем работы в среде с неуправляемой памятью.
Неуправляемые среды памяти желательны для многих разработчиков, потому что программа имеет прямой контроль над использованием своего пространства памяти. Разработчик может вытеснять операции с большим объемом данных и запрашивать блоки памяти до того, как они потребуются немедленно, что снижает нагрузку на процессор. Кроме того, они, как правило, лучше осведомлены о том, как память используется их программой, и могут освободить память с относительной уверенностью, что она не используется.
Несмотря на то, что существует множество практик, направленных на предотвращение утечек, кредо всегда одно: следите за тем, что вы используете, и очищайте то, чем вы не являетесь. На практике это просто означает, что для каждого выделения, которое делает программа, перед завершением программы необходимо убедиться, что существует хотя бы выпуск того же размера.
Как избежать утечек памяти
Большинство утечек памяти вызвано практикой кода или методами, которые не дополняют механизмы, с помощью которых среда выделяет и освобождает память. По мере развития программных технологий термин "среда" стал более гибким, поскольку многие языки имеют свои собственные механизмы, помогающие системе управлять памятью. Несмотря на то, что может существовать семантика, зависящая от среды, в большинстве случаев предотвращение утечек основано на простых методах, которые зависят от типа среды памяти, в которой работает программа. В общем, для предотвращения утечек памяти необходимы два важных компонента:
- Осведомленность об окружающей среде, в которой будет работать программа
- Некоторое понимание того, как язык, на котором написана программа, выделяет и освобождает память
Из-за зависимости от среды памяти и семантики языка большая часть информации об утечках памяти зависит от среды. Хорошие практики могут потребовать конкретных исследований операционной системы и семантики языка или общих исследований типа среды памяти и модели разработки. Обратитесь к документации по операционной системе и языку программирования для получения более подробной информации.