System.OutOfMemoryException - PullRequest
       1

System.OutOfMemoryException

2 голосов
/ 12 июля 2010

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

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

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

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

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

Например, на этой странице обсуждается ряд различных подходов.

3 голосов
/ 12 июля 2010

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

1 голос
/ 12 июля 2010

Вы можете попробовать получить техническую информацию, используя WinDbg с расширением Sosex DLL.Если вы не знакомы с WinDbg, попробуйте прочитать блог Тесс Феррандез , который является золотым рудником отладочной информации .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.

1 голос
/ 12 июля 2010

Используйте WinDBG.Вот пример обнаружения утечек памяти с использованием WinDBG в блоге Tess.

...