[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
У світі керованих мов програмування, таких як C#, збирання сміття відіграє ключову роль в ефективному управлінні пам’яттю. Збирач сміття автоматично звільняє пам’ять, зайняту об’єктами, які більше не використовуються, що звільняє розробників від необхідності вручну керувати цим процесом. Однак, іноді може виникнути необхідність вручну керувати або змусити збирач сміття виконати збірку. У цій статті ми розглянемо, коли і як можна використовувати такі механізми, і як це може вплинути на продуктивність і стабільність вашої програми.
Збирач сміття автоматично керує звільненням невикористаної пам’яті. Однак, у деяких випадках може знадобитися примусово викликати збирання сміття. Це можна зробити за допомогою методу GC.Collect(). Ось приклад, як це зробити:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Program { static void Main() { CreateObjects(); Console.WriteLine($"Память перед сборкой мусора: {GC.GetTotalMemory(false)} байт"); // Принудительно вызываем сборщик мусора GC.Collect(); // Ожидаем завершения финализации GC.WaitForPendingFinalizers(); Console.WriteLine($"Память после сборки мусора: {GC.GetTotalMemory(true)} байт"); } static void CreateObjects() { for (int i = 0; i < 10000; i++) { var obj = new object(); } } } |
Розглянемо інший приклад, ми створимо клас, який явно реалізує інтерфейс IDisposable для коректного звільнення ресурсів. Після використання об’єктів цього класу ми будемо викликати збирач сміття для демонстрації звільнення ресурсів:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class ResourceHog : IDisposable { private bool disposed = false; public void UseResource() { if (disposed) throw new ObjectDisposedException("ResourceHog", "Объект был освобожден"); Console.WriteLine("Использование ресурсов..."); } // Реализация IDisposable для освобождения ресурсов public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { Console.WriteLine("Освобождение управляемых ресурсов..."); } Console.WriteLine("Освобождение неуправляемых ресурсов..."); disposed = true; } } ~ResourceHog() { Dispose(false); } } class Program { static void Main() { using (var hog = new ResourceHog()) { hog.UseResource(); } Console.WriteLine("Вызов сборщика мусора..."); GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine("Сборка мусора завершена."); } } |
ResourceHog – це клас, який має метод UseResource(), що емулює використання ресурсів (у даному випадку, просто виведення в консоль). IDisposable інтерфейс і метод Dispose() використовуються для коректного звільнення керованих і некерованих ресурсів. Цей приклад демонструє як використання IDisposable у поєднанні з явним викликом GC.Collect() може допомогти керувати ресурсами в C#.
Стоит отметить, что вызов GC.Collect() может негативно сказаться на производительности приложения и рекомендуется использовать его только в исключительных случаях. В большинстве ситуаций лучше полагаться на автоматическое управление памятью, предоставляемое CLR (Common Language Runtime).