Получите активные ссылки на объект

<form>
   <label>Thingy 1: <input class="a" type="text" name="one" /></label>
   <label>Thingy 2: <input class="a" type="text" name="two" /></label>
   <label>Thingy 3: <input class="b" type="checkbox" name="three" /></label>
   <label>Thingy 4: <input class="b" type="checkbox" name="four" /></label>
</form>

и следующий css

form label { display: block; }
5
задан Paul Stovell 24 November 2009 в 00:11
поделиться

3 ответа

Неуправляемая dll SOS (Son Of Strike) предоставляет средства для достижения этой цели, хотя Я не верю, что он имеет значительную поддержку сценариев, он также не предоставляет простых средств для достижения этого с помощью одной команды. Вам нужно будет изучить адрес переменной, проверить все gcroots на предмет переменной (которая, очевидно, будет включать стек) и обработать остаток.

Я бы посоветовал это, если вы хотите доказать, что объект не , более простой способ - (временно) сделать его финализируемым, убедиться, что он больше не упоминается в стеке вашего модульного теста, а затем принудительно выполнить несколько сборок мусора через GC.Collect () , затем используйте GC.WaitForPendingFinalizers () .

Ваш метод finalize может установить статический логический флаг, а затем ваш модульный тест может подтвердить, что это правда.

5
ответ дан 14 December 2019 в 01:10
поделиться

.NET Profiler использует API профилирования для отслеживания графа объектов. Вас могут особенно заинтересовать методы обратного вызова ObjectReferences и RootReferences , а также, возможно, ObjectAllocated . Первые два метода будут вызываться для охвата всего графа живых объектов после каждой сборки мусора, поэтому перехвата их одних достаточно, чтобы перестроить этот граф, а затем проанализировать его любым способом.

В этой статье объясняется, как собрать все части вместе.

3
ответ дан 14 December 2019 в 01:10
поделиться

Also remember .NET uses traced garbage collection so objects referenced by other objects - e.g. a graph of objects - will still be cleaned up by the GC if your app isn't referencing any of them any longer; it's a lot smarter than the classic reference counting garbage collection algorithms pre-.NET. This means that even when you find a way to pinpoint all references to an object, some of them may not matter and may not need to be taken care of.

This doesn't answer directly how to find all references to an object, but does make readers aware of the the situation that, when you do find all references through a tool or utility, some kinds of things don't need to be fixed any longer in .NET - e.g. classic circular references, and therefore you might have to look for some ingenious ways of knowing what to ignore when trying to fix memory leaks.

This explanation only applies to the managed code scenario.

1
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: