Last active
October 28, 2025 12:13
-
-
Save sunmeat/adaff217aa5a55ecae3882a502e181b6 to your computer and use it in GitHub Desktop.
GC.Collect C# example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System.Text; | |
| namespace GCExample | |
| { | |
| class Person | |
| { | |
| public string Name { get; set; } | |
| public string Surname { get; set; } | |
| public byte Age { get; set; } | |
| public Person(string name, string surname, byte age) | |
| { | |
| Name = name; | |
| Surname = surname; | |
| Age = age; | |
| } | |
| public Person() : this("Олександр", "Загоруйко", 36) | |
| { | |
| } | |
| } | |
| class GarbageHelper | |
| { | |
| // створює тимчасові об'єкти для симуляції сміття в пам'яті | |
| public void MakeGarbage(int count) | |
| { | |
| for (int i = 0; i < count; i++) | |
| { | |
| var person = new Person(); | |
| } | |
| } | |
| } | |
| class Program | |
| { | |
| static void Main() | |
| { | |
| Console.OutputEncoding = Encoding.UTF8; | |
| Console.ForegroundColor = ConsoleColor.Red; | |
| Console.WriteLine("БАЗОВА ІНФОРМАЦІЯ ПРО СИСТЕМУ: \n" + | |
| "-----------------------------\n"); | |
| Console.ForegroundColor = ConsoleColor.White; | |
| Console.WriteLine(@"Операційна система: {0} | |
| Версія .NET: {1}", Environment.OSVersion, Environment.Version); | |
| Console.ForegroundColor = ConsoleColor.Red; | |
| Console.WriteLine("\nІНФОРМАЦІЯ ПРО ЗБІР СМІТТЯ: \n" + | |
| "---------------------------\n"); | |
| Console.ForegroundColor = ConsoleColor.White; | |
| Console.WriteLine(@"Кількість байтів у купі (без збору): {0} | |
| Максимальна кількість підтримуваних поколінь об'єктів: {1}" | |
| , GC.GetTotalMemory(false), GC.MaxGeneration + 1); | |
| Console.WriteLine("\nМаксимальний індекс покоління: {0}", GC.MaxGeneration); | |
| var helper = new GarbageHelper(); | |
| // покоління - етап життєциклу об'єкта в gc, де 0 - наймолодше | |
| Console.WriteLine("Початкове покоління об'єкта helper: {0}", GC.GetGeneration(helper)); | |
| Console.WriteLine("\nПочаткова зайнята пам'ять (без збору): {0:N0} байтів", GC.GetTotalMemory(false)); | |
| // створюємо сміття та спостерігаємо зростання пам'яті | |
| helper.MakeGarbage(10000); | |
| Console.WriteLine("Після створення сміття (без збору): {0:N0} байтів", GC.GetTotalMemory(false)); | |
| // примусовий збір сміття для очищення | |
| GC.Collect(); | |
| GC.WaitForPendingFinalizers(); | |
| Console.WriteLine("Після збору сміття: {0:N0} байтів", GC.GetTotalMemory(true)); | |
| Console.WriteLine("Покоління об'єкта helper після першого збору: {0}", GC.GetGeneration(helper)); | |
| // повторюємо для демонстрації просування поколінь | |
| for (int round = 1; round <= 3; round++) | |
| { | |
| Console.WriteLine($"\nРаунд {round}: Створення додаткового сміття"); | |
| helper.MakeGarbage(20000 * round); | |
| Console.WriteLine("Зайнята пам'ять перед збором: {0:N0} байтів", GC.GetTotalMemory(false)); | |
| GC.Collect(); | |
| GC.WaitForPendingFinalizers(); | |
| Console.WriteLine("Зайнята пам'ять після збору: {0:N0} байтів", GC.GetTotalMemory(true)); | |
| Console.WriteLine("Покоління об'єкта helper: {0}", GC.GetGeneration(helper)); | |
| Console.WriteLine("Кількість зборів для покоління 0: {0}", GC.CollectionCount(0)); | |
| Console.WriteLine("Кількість зборів для покоління 1: {0}", GC.CollectionCount(1)); | |
| Console.WriteLine("Кількість зборів для покоління 2: {0}", GC.CollectionCount(2)); | |
| } | |
| var person1 = new Person("Олександр", "Загоруйко", 36); | |
| Console.WriteLine("\nПокоління об'єкта person1 спочатку: {0}", GC.GetGeneration(person1)); | |
| // великий цикл для просування person1 у вищі покоління | |
| for (int i = 0; i < 100000; i++) | |
| { | |
| var tempPerson = new Person(); | |
| if (i % 50000 == 0) | |
| { | |
| GC.Collect(); | |
| GC.WaitForPendingFinalizers(); | |
| } | |
| } | |
| Console.WriteLine("Покоління об'єкта person1 після інтенсивного створення сміття: {0}", GC.GetGeneration(person1)); | |
| Console.WriteLine("\nНатисніть Enter для виходу..."); | |
| Console.ReadLine(); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment