Linux

Как обнаружить и устранить утечку памяти в Linux за 10 минут

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

Обновлено 29 июля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04 LTSUbuntu 22.04 LTSDebian 11Fedora 36

Введение / Зачем это нужно

Утечка памяти — это ситуация, когда программа выделяет память, но не освобождает её обратно, что со временем приводит к замедлению работы, сбоям или даже краху процесса. В Linux подобные проблемы становятся критическими при работе с долгоживущими сервисами, контейнерами или ботами. Быстрое выявление и исправление утечек позволяет сохранить производительность, продлить срок службы приложения и избежать потери ресурсов.

Требования / Подготовка

  • ОС: Ubuntu 20.04+, Debian 11, Fedora 36 или любая современная дистрибутива Linux.
  • Права: необязательны, но для системных утилит могут потребоваться права администратора (sudo).
  • Установленные инструменты: gcc/g++ (если компилируете код), valgrind, strace, gdb (необязательно), python3-memory-profiler (для Python).

Пошаговая инструкция

Шаг 1: Установите инструменты диагностики

Для начала установите необходимые инструменты диагностики:

sudo apt update
sudo apt install valgrind gdb python3-memory-profiler

На Fedora:

sudo dnf install valgrind python3-memory-profiler

💡 Совет: Установите отладочные символы (debuginfo), чтобы трассировка была более точной.

Шаг 2: Запустите программу под valgrind

Запустите приложение с помощью инструмента Massif, который отслеживает динамическое выделение памяти:

valgrind --tool=massif ./your_program

valgrind создаст файл massif.out.<pid>. Проанализируйте его:

ms_print massif.out.<pid>   # простой текстовый отчёт

Для визуализации используйте gmmsa или любой другой визуализатор.

Шаг 3: Используйте strace для отслеживания выделений

Отслеживайте системные вызовы, связанные с выделением памяти:

strace -ff -e mmap,brk ./your_program 2>&1 | grep 'mmap'

Обратите внимание на вызовы mmap/brk, которые не сопряжены с последующим освобождением.

Шаг 4: Проверьте рост RSS с помощью монитора

Запустите программу в фоновом режиме и наблюдайте за её RSS в реальном времени:

./your_program &
watch -n 1 'ps -C your_program -o pid,rss'

Постоянный рост rss (при отсутствии фоновых задач) указывает на утечку.

Шаг 5: Исправьте обнаруженную утечку

Для C/C++: Проверьте каждый вызов malloc, calloc, realloc на наличие соответствующего free. Используйте статический анализатор, например clang-analyzer:

scan-build make

Для Python: Используйте tracemalloc или memory_profiler:

import tracemalloc
tracemalloc.start()
# ваш код
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
    print(stat)

Освободите неиспользуемые объекты (del), удалите циклические ссылки или используйте weakref.

Проверка результата

После внесения исправлений запустите диагностику повторно:

valgrind --tool=massif ./your_program

Если файл Massif показывает стабильное потребление памяти, или watch отображает неизменный RSS, утечка устранена.

Для гарантированной проверки выполните цикл из многих итераций (например, 1000 запусков) и наблюдайте за средним ростом памяти:

for i in {1..1000}; do ./your_program; done | valgrind --tool=massif

Возможные проблемы

  • Нет отладочных символов: valgrind может не отобразить точное местоположение утечки. Скомпилируйте программу с -g и без оптимизаций (-O0).
  • Сложные паттерны (например, GC в Python): иногда утечка скрыта в модулях третьих сторон. Используйте objgraph, чтобы визуализировать объекты.
  • Потоки и мьютексы: утечка может происходить из-за неправильного освобождения ресурсов в потоках. Запустите программу с strace -f, чтобы отследить все дочерние процессы.
  • Память, выделенная через mmap напрямую: не все выделения проходят через malloc. Используйте cat /proc/<pid>/maps, чтобы увидеть все отображённые регионы.

Следуйте этим шагам, и вы сможете быстро выявить и устранить большинство утечек памяти в Linux-среде. Удачной отладки!

Часто задаваемые вопросы

Как понять, что в Linux-программе происходит утечка памяти?
Можно ли автоматически обнаружить утечку без valgrind?
Что делать, если утечка вызвана кодом на Python?
Как предотвратить утечку памяти в будущем?

Полезное

Установите инструменты диагностики
Запустите программу под valgrind
Используйте strace для отслеживания выделений
Проверьте рост RSS с помощью монитора
Исправьте обнаруженную утечку