2015-05-15 4 views
1

Есть ли способ проверить, какие экземпляры классов собраны GC, а какие нет? Один вариант я нашел, проверяя класс, тест, как описано здесь:C# Check Garbage Collection

How can I write a unit test to determine whether an object can be garbage collected?

+5

Где это необходимо? – thijmen321

+0

Классы не собираются GC, но экземпляры всех классов. В общем, вы можете протестировать коллекцию, имея слабую ссылку на нее и видя, насколько она еще жива, но как лучше всего это может зависеть только от того, что вам нужно. –

+0

@JonHanna, извините, пропустил слово "экземпляры". Я пытаюсь правильно писать код и избегать утечек памяти. Поэтому я хочу проверить, какие экземпляры все еще «Живые», даже если я их не использую и их собирают. – Spirosi

ответ

2

Есть ли способ проверить, какие классы собраны GC, а какие нет?

Нет, поскольку для проверки объекта вам все равно нужна ссылка на него, и это предотвратит его сбор.

Вы можете создать администрацию с помощью WeakReferences, но это будет неудобно и дорого. Конечно, это невозможно для всех объектов.

Более важно, вам не нужно это делать. Если вы думаете, что делаете, проанализируйте этот мыслительный поезд.

0

создать ReferenceTester класс, который проведет Dictionary недели ссылок Словарь использовать их, чтобы проверить, если класс есть. затем вызовите GC.Collect().

затем проверьте ReferenceTester еще раз, если класс все еще там.

-1

Вы также можете указать, когда объект был выведен Мусор, собранный с помощью финализатора. Это не гарантируется на 100%, поскольку вы по-прежнему вызываете GC.SupressFinalize() для классов, которые предотвратят сбор.

+0

Существует целый ряд причин, почему финализатор может не вызываться, а 'SuppressFinalize()' является наименьшим из них. Нет никакой гарантии, что финализатор когда-либо будет вызван. –

+0

И наличие Finalizer (деструктор) очень дорого. Вы не хотите этого на всех (многих) ваших объектах. –