пятница, 17 октября 2008 г.

Утечка памяти - Memory Leak

Явный признак - наличие ошибки OutOfMemoryError в Java или OutOfMemoryException в .NET. Ее можно найти в логах сервера или приложения, либо сообщение о нем будет выведено на экран. В разных языках программирования название ошибки может выглядеть иначе, но смысл её будет прежним - Недостаточно памяти для завершения операции.

Утечка памяти может воспроизвестись по-разному, в зависимости от того в какой части системы она поселилась, а так же самой реализации приложения.

Иногда причина возникновения OutOfMemoryError - это недостаточное выделение памяти приложению. Допустим для загрузки всех объектов в память требуется 128Мб, а приложению выделили только 64Мб.

Если же с конфигурацией все в порядке, а размер используемой памяти постоянно увеличивается, то это реальный memory leak.
Для начала, как и с любой багой ее нужно локализовать, т.е. определить в каких случаях, какая операция вызывает эту проблему. И уже потом её решать.
Наиболее сложно отлавливаемый memory leak - это тот, который кушает мало и воспроизводится очень долго. Подобная утечка памяти определима только при запуске длительных тестов (тестов стабильности). В моей практике был случай, когда такого рода утечка воспроизводилась только через 30 часов работы теста.

Как можно найти memory leak в Java?
Установите профайлер, который бы мониторил ресурсы и работу Garbage Collector (GC). Сборщик мусора очищает память от отработавших объектов и, если ссылки на объект не удаляются приложением, то GC не сможет удалить данный объект из памяти. Как результат - OutOfMemoryError.

Постройте график используемой памяти по времени. Получится лесенка, где ступенька вниз - очистка памяти GC, вверх - загрузка памяти приложением.
Если, в ходе работы приложения, график загруженности памяти лесенка идет вверх, то налицо утечка!!!

Как пример можно рассмотреть следующий скриншот:

Здесь мы видим, что размер используемой памяти растет до отметки 0:30, далее он стабилизируется, т.е. отработанные объекты удаляются и не занимают место в памяти. Если же они не очищались бы, то количество используемой памяти продолжал бы расти и после отметки 0:30, и в результате мы бы получили утечку памяти или Memory Leak

Отправить комментарий

Условия копирования публикаций:

Все публикации в данном блоге являются частной собственностью авторов. Любое копирование информации допускается только при условии указания имени автора и активной ссылки на источник.