Информация об изменениях

Сообщение Re[2]: Сборка мусора. Странное поведение. Утечка. от 14.06.2020 9:39

Изменено 14.06.2020 9:48 alexzzzz

Re[2]: Сборка мусора. Странное поведение. Утечка.
Здравствуйте, takTak, Вы писали:

T>A finalizer is implicitly called when the memory occupied by the object is reclaimed. However, a finalizer is not guaranteed to be called by the GC — it may or may not be called at all. In essence, a finalizer works on a non-deterministic mode – the runtime doesn’t guarantee that a finalizer would be called at all.


Но все эти предупреждения про то, что исполнение финализаторов не гарантируется, не означают, что рантайм не будет честно пытаться их выполнить. Все описываемые случаи, когда выполнение финализаторов не происходит, связаны с какими-то нештатными ситуациями. Точно так же можно утверждать, что рантайм не гарантирует выполнение операции умножения ― ведь где-то раньше в том же потоке может возникнуть исключение, поток грохнется и все последующие операции умножения в нём не выполнятся. Или память кончится, или стек потока переполнится, или электричество пропадёт...

Если ничего нештатного не происходит, то выполнение
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

должно
1) запустить сборку мусора;
2) найти весь мусор с финализаторами и отправить эти финализаторы в очередь на выполнение в отдельном потоке финализации;
3) дождаться их завершения;
4) ещё раз проверить мусор, и если объекты с финализаторами не воскресли, а всё ещё остаются мусором, удалить их тоже.
Re[2]: Сборка мусора. Странное поведение. Утечка.
Здравствуйте, takTak, Вы писали:

T>A finalizer is implicitly called when the memory occupied by the object is reclaimed. However, a finalizer is not guaranteed to be called by the GC — it may or may not be called at all. In essence, a finalizer works on a non-deterministic mode – the runtime doesn’t guarantee that a finalizer would be called at all.


Но все эти предупреждения про то, что исполнение финализаторов не гарантируется, не означают, что рантайм не будет честно пытаться их выполнить. Все описываемые случаи, когда выполнение финализаторов не происходит, связаны с какими-то нештатными ситуациями. Точно так же можно утверждать, что рантайм не гарантирует выполнение операции умножения ― ведь где-то раньше в том же потоке может возникнуть исключение, поток грохнется и все последующие операции умножения в нём не выполнятся. Или память кончится, или стек потока переполнится, или электричество пропадёт...

Если ничего нештатного не происходит, то выполнение
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

должно вполне детерминированно
1) запустить сборку мусора;
2) найти весь мусор с финализаторами и отправить эти финализаторы в очередь на выполнение в отдельном потоке финализации;
3) дождаться их завершения;
4) ещё раз проверить мусор, и если объекты с финализаторами не воскресли, а всё ещё остаются мусором, удалить их тоже.