[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по настройке производительности


Обнаружение утечек памяти в программах

Утечкой памяти называется ошибка в программе, заключающаяся в том, что программа многократно запрашивает память, не освобождая ее. Утечка памяти в долго работающей программе, например, в интерактивном приложении, представляет серьезную проблему, поскольку может привести к фрагментации памяти и накоплению в физической памяти большого количества страниц, заполненных "мусором". Известны случаи, когда утечка памяти в одной программе приводит к переполнению пространства подкачки.

Для обнаружения утечек памяти вызовите команду 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


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]