17.1.23

Утечка памяти - определение и классификация

По материалам статьи Slava Oks: Look at Memory Leaks - Classify and Identify


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

Утечка памяти, это очень часто наблюдаемая проблема, вызванная ошибками в программировании. Автор считает, что очень важно знать об этих проблемах и подходах к их устранению. После ознакомления с работой процессов, подобные ошибки уже не должны казаться неразрешимыми.
Когда происходит утечка, первым делом разработчик должен классифицировать её. Сколько раз можно было слышать о том, что работа приложения была прервана или оно перестало откликаться из-за утечки памяти? Фраза "утечка памяти" может означать утечку из разных ресурсов памяти. Вспомните предыдущие статьи автора, где он говорил о VAS, физической памяти, файле подкачки и т.д. Приложение может обрушить любой из этих ресурсов. Это означает, что утечка памяти - это неполная фраза, которая не имеет большого смысла. Необходимо добавить больше определённости при рассмотрении утечки.
Классификация утечки чрезвычайно важна. В представленной ниже таблице показаны типы утечки памяти и инструменты, которые можно использовать для их классификации. Имейте в виду, что можно перечислить большее число инструментов и больше количество типов утечки. Автор показал только самые распространённые типы, с которыми он чаще всего имел дело.

Memory Resource\ToolTask ManagerPerfMonWinDbgWinDbg
Local Kernel Debugger
VADUMPSQL Server
VAS Process
/Virtual Bytes
!vadump
!heap
!vadX 
Physical MemoryVirtual MemoryProcess
/Private Bytes
!vadump
!heap
!memusage
!vm
X 
Page FileCommit ChargeMemory
/Committed Bytes
 !memusage
!vm
X 
AWE     Buffer Manager
/Total pages
HandleHandlesObjects!handle!handle  

После классификации утечки, её нужно идентифицировать. Идентификация утечки достигается отслеживанием подверженного утечке стека. Как только этот стек будет определён, можно считать, что утечка идентифицирована. Имейте в виду, что во многих случаях не достаточно идентифицировать строку или её номер в файле. Представленная ниже таблица предлагает Вам инструменты, которые можно использовать для идентификации утечки:

Memory Resource\Toolumdh/pageheapLeakDiagWinDbgWinDbg
Local Kernel Debugger
VAS Virtual Allocator!heap -l 
Physical MemoryWindows HeapsWindows Heaps
CRT Heap
COM Heap
MDAC Heap
!vadump
!heap
!memusage
!vm
Handle  Break points on CreateEvent,
CreateMutex,

CloseHandle
!htrace

На практике классификация утечки не является столь жесткой и делается очень быстро. Сотрудники, занимающиеся тестирование и поддержкой должны уметь это делать, или можно автоматизировать сам процесс классификации. Идентифицировать утечку значительно сложнее и это занятие более трудоёмко. Этот процесс может сопровождаться перезапуском сервисов, использованием нескольких инструментов и т.д. Знание того, как эти инструменты работает, и грамотное обращение с ними является обязательной составляющей успешности идентификации и требует накопления большого опыта в разрешении подобных проблем. Имея такой опыт, намного проще будет разбираться с утечками памяти. Единственная проблема состоит в том, что всегда будут существовать вероятность появления такой утечки, которую не смогут отследить ваши инструменты. Если так случится, тогда Вам ничего не остаётся, как засесть за написание своего собственного LeakDiag.
Автору встречались несколько доступных, коммерческих инструментов, предоставляющих возможность классификации и идентификации утечки. Автор давно ими не пользовался, но из прошлого опыта их применения он не может сказать, что они работают лучше, чем описанные в этой статье. Перед покупкой подобных инструментов, стоит удостоверится, что они работают понятным Вам образом и если, к примеру, такой инструмент может идентифицировать утечку только при завершении процесса, он вряд - ли представляет интерес для использования. Кроме того, Если Вы проводите исследования на высокопроизводительном сервере и используете собственного менеджера памяти, большинство коммерческих инструментов Вам не подойдут.

Комментариев нет:

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