Утечкой памяти называется ошибка в программе, заключающаяся в том, что программа многократно запрашивает память, не освобождая ее. Утечка памяти в долго работающей программе, например, в интерактивном приложении, представляет серьезную проблему, поскольку может привести к фрагментации памяти и накоплению в физической памяти большого количества страниц, заполненных "мусором". Известны случаи, когда утечка памяти в одной программе приводит к переполнению пространства подкачки.
Для обнаружения утечек памяти вызовите команду svmon и найдите процессы, рабочие сегменты которых постоянно увеличиваются. Утечка в сегменте ядра может быть вызвана утечкой mbuf, утечкой в драйвере устройства, расширении ядра и даже в ядре. Для того чтобы найти расширяющиеся сегменты памяти, вызовите команду svmon с флагом -i и проанализируйте изменение размера сегментов отдельных процессов и групп процессов.
Определить конкретную функцию или строку кода, служащую причиной утечки памяти, намного сложнее. Особенно трудно это сделать в приложениях AIXwindows, которые содержат большое число вызовов malloc() и free(). Для анализа использования памяти и обнаружения утечек в приложениях на C++ предусмотрена программа HeapView Debugger. Кроме того, существуют программы других фирм для анализа утечек памяти, однако для их работы необходим исходный код программы.
Некоторые вызовы realloc(), сами по себе не являясь ошибкой, также могут служить причинами утечки памяти. Если программа часто вызывает функцию realloc() для увеличения размера области данных, рабочий сегмент процесса становится сильно фрагментированным при условии, что память, освобожденная функцией realloc(), не используется программой для других целей.
Для освобождения памяти рекомендуется использовать функции disclaim() и free(). Функция disclaim() должна вызываться перед функцией free(). Однако освобождать память, выделенную функцией malloc(), не нужно, если эта функция вызывается незадолго до завершения программы. Это связано с тем, что при завершении программы ее рабочий сегмент памяти удаляется, а страницы физической памяти, содержащие данные из рабочего сегмента, добавляются в список свободных страниц. Ниже приведен пример анализа программы с утечкой памяти. Значения показателей Занято, Пр. подк. и Адресное пространство личного рабочего сегмента этой программы все время увеличиваются.
Ниже приведен пример вывода команды, запущенной в AIX 4.3.2 (в AIX 4.3.3 и выше команда выдает те же данные, но в другом формате):
# svmon -P 19556 -i 1 3 Pid Команда Занято Закр. Пр. подкачки 19556 pacman 3085 1 1580 Pid: 19556 Команда: pacman ИД сег. Тип Описание Занято Закр. Пр.подк. Диапазон адресов 9c8 пост. /dev/hd2:53289 1 0 0 0..0 aaf раб. данные библиотеки 12 0 6 0..1081 909 раб. код общей библиотеки 1502 0 7 0..65535 1eba раб. личный сегмент 1568 1 1567 0..1562:65313..65535 16f3 пост. код,/dev/lv01:12302 2 0 0 0..1 Pid Команда Занято Закр. Пр. подкачки 19556 pacman 3114 1 1609 Pid: 19556 Команда: pacman ИД сег. Тип Описание Занято Закр. Пр.подк. Диапазон адресов 9c8 пост. /dev/hd2:53289 1 0 0 0..0 aaf раб. данные библиотеки 12 0 6 0..1081 909 раб. код общей библиотеки 1502 0 7 0..65535 1eba раб. личный сегмент 1597 1 1596 0..1591:65313..65535 16f3 пост. код,/dev/lv01:12302 2 0 0 0..1 Pid Команда Занято Закр. Пр. подкачки 19556 pacman 3149 1 1644 Pid: 19556 Команда: pacman ИД сег. Тип Описание Занято Закр. Пр.подк. Диапазон адресов 9c8 пост. /dev/hd2:53289 1 0 0 0..0 aaf раб. данные библиотеки 12 0 6 0..1081 909 раб. код общей библиотеки 1502 0 7 0..65535 1eba раб. личный сегмент 1632 1 1631 0..1626:65313..65535 16f3 пост. код,/dev/lv01:12302 2 0 0 0..1