2010-07-12 2 views
2

Я пытаюсь исправить старую, неуклюжую сложную устаревшую систему с утечкой памяти. Я проследил проблему, и лучший способ описать утечку памяти - это то, что она «по дизайну». Проще говоря, есть наблюдатель событий, который держит ссылку на объекты после того, как они были оставлены. По этой причине объекты не могут собираться сборщиком мусора и оставаться в памяти на неопределенный срок.System.OutOfMemoryException

Есть ли способ получить коллекцию объектов, которые в настоящее время содержат ссылку на экземпляр?

ответ

1

Вы можете попробовать получить техническую информацию с помощью WinDbg с DLL-расширением Sosex. Если вы не знакомы с WinDbg, попробуйте прочитать Tess Ferrandez blog, который является золотым моментом для отладочной информации .NET.

В принципе, Sosex.dll имеет команду !Refs, в которой перечислены объекты, имеющие ссылку на определенный адрес объекта. Например:

Usage: 
!refs <hexObjectAddr> 

Lists all references held by the specified object 
Lists all references to the specified object (searches heaps, stacks, registers, handle tables and the freachable queue) 

Refs are listed in the following format: 
hexAddr decSize strTypeName 

Sample output: 
0:000> !sosex.refs 7fff2970 
Objects referenced by 7fff2970: 
7fff1100   64 System.IO.__ConsoleStream 
7fff1388  136 System.Text.SBCSCodePageEncoding 
7fff2c50   48 System.Text.DecoderNLS 
7fff2c80  280 System.Byte[] 
7fff2d98  536 System.Char[] 
7fff1140   24 System.Byte[] 

Objects referencing 7fff2970: 
7fff2fb0   32 System.IO.TextReader+SyncTextReader 
`` 

Пожалуйста, обратите внимание, что это очень хардкорный решение, которое потребует справедливого немного подготовки, если вы, новичок в этом. Однако это может быть очень мощный способ отладки .NET-приложений.

3

Я не знаю такого способа.
Но - коллекция слабых ссылок может быть удобной в таких ситуациях.
Взгляд here

3

Нет, если вы не используете API-интерфейс отладчика.

Один из вариантов для такого рода - класс WeakReference. Если вы ищете WeakReference вместе с событиями, вы найдете довольно много документов с предложениями о том, как справиться именно с этой проблемой. Ни один из них не является особенно чистым, из того, что я помню, но они должны работать достаточно хорошо.

В качестве примера this page обсуждает ряд различных подходов.

Смежные вопросы