Одна из самых распространенных проблем, с которой сталкиваются разработчики, – это поиск утечек памяти. Как узнать, не происходит ли утечка памяти в вашем приложении?
В этой статье вы узнаете:
- что такое утечка памяти;
- как утечки памяти могут повлиять на ваше приложение;
- что вызывает утечки памяти;
- как найти утечку памяти.
Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туториалов, задач по автоматизации и книг по QA.
Что такое утечка памяти?
Утечка памяти может произойти в любом приложении и в любом языке программирования. Но что такое утечка памяти?
Утечка памяти происходит, когда программист использует память в больших объемах и не освобождает ее. Когда мы говорим “память”, мы имеем в виду оперативную память (RAM, Random Access Memory), а не постоянную память (ROM, Read Only Memory). Если приложение потребляет много памяти, но не освобождает ее, то со временем оно исчерпает RAM. В результате приложение может крашнуться.
Раньше, когда разработчики использовали только C и C++, утечки памяти случались очень часто. Причина в том, что разработчикам приходилось вручную освобождать память приложения после ее использования. Это было непросто, ведь у них были другие, более важные задачи.
К счастью, высокоуровневые языки программирования решили эту проблему с помощью функций, которые могут автоматически освобождать память. Одна из них – сборщик мусора (GC, Garbage Collector). Однако GC не всегда может полностью освободить память. Некоторые объекты без ссылок на них могут обойти сборщик мусора и вызвать утечку памяти.
Что вызывает утечку памяти для каждого языка программирования?
Python
Утечки памяти часто встречаются в Python. Иногда сборщики мусора в Python не проверяют объекты без ссылок. Неиспользуемые данные, проигнорированные GC, должны быть вручную удалены программистом. Если они не освобождаются, это приводит к утечкам памяти в Python.
Утечки памяти в Python происходят по нескольким причинам:
- Когда у нас есть объект, который больше не используется. Это приводит к тому, что он занимает дополнительную память и приводит к утечке.
- Циклические ссылки в коде, когда объекты ссылаются друг на друга. Это означает, что даже если объекты больше не нужны, сборщик мусора не может удалить их из памяти, что в итоге приводит к утечке.
- Иногда внутренние библиотеки неправильно управляют памятью, что также может вызвать утечки.
PHP
PHP – еще один язык программирования, который хорошо знаком с утечками памяти. Хотя в PHP есть сборщик мусора для предотвращения утечек памяти, часто некоторые факторы мешают GC успешно выполнять свою задачу.
Возьмем для примера такую ситуацию: счетчик ссылок (refcount) , который отслеживает количество активных ссылок на объект, не уменьшается. В этом случае GC определяет, что объект не является мусором, поскольку технически он все еще используется. Таким образом GC не очищает память, зарезервированную для этого объекта.
Как утечки памяти влияют на бизнес?
Утечки памяти могут негативно повлиять на ваш бизнес. Утечки не так заметны, как обычные баги. Считайте, что это тихий убийца вашей программы. Он пробирается через систему и медленно разрушает программу.
Снижение производительности
Утечки памяти не влияют напрямую на поведение вашей программы. Однако накопленные утечки способствуют снижению производительности приложения из-за исчерпания системной памяти. Не забывайте, что UX (User Experience) важен для успешного бизнеса. Если ваше приложение предлагает плохой UX, то оно обречено на провал.
Доступность и надежность
Поскольку утечки памяти могут медленно ухудшать производительность приложения, это может сильно повлиять на его доступность и надежность.
Авария в работе веб-сервисов Amazon
Наглядным примером того, как утечка памяти может сильно повлиять на бизнес, является инцидент, произошедший с Amazon в 2012 году, когда в техническом обслуживании произошла ошибка. Amazon решила заменить свой сервер баз данных, однако неправильная конфигурация сервера привела к утечке памяти. Утечка вышла из-под контроля, сервер перестал работать и затронул миллионы пользователей.
Как найти утечки памяти
Обнаружить утечки памяти очень сложно. Вы вряд ли сможете обнаружить и устранить их на ранней стадии разработки ПО. Чтобы правильно обнаружить утечку памяти, необходимо хорошо понимать работу приложения и детали того, как программа выделяет память для объектов.
Первым признаком утечки является нехватка памяти. Прежде чем ваша программа завершится из-за исчерпания памяти, вы заметите некоторые признаки, например, ваше приложение начнет работать медленнее. В таком случае вам нужно просмотреть свой код и найти места, где происходит излишнее потребление памяти.
Как предотвратить утечки памяти?
Хотя не существует универсального способа предотвращения утечек памяти, следующие меры могут помочь избежать их:
- Поскольку утечки памяти вызваны скоплениями неиспользуемых данных, убедитесь, что ваш сборщик мусора включен. Сборщик мусора является вашей первой линией защиты. Познакомьтесь с алгоритмом сборки мусора в вашем языке программирования, чтобы использовать его в полной мере.
- Другой способ предотвратить утечки памяти – написание кода, который избавляется от ненужных ресурсов. Поскольку есть объекты, которые сборщик мусора не освобождает, разработчик должен написать специальный код, который сообщает приложению, что работа с ресурсом завершена.
Перевод статьи cherrera@fullscale.io «How to Find Memory Leaks».