Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active October 28, 2025 12:13
Show Gist options
  • Save sunmeat/adaff217aa5a55ecae3882a502e181b6 to your computer and use it in GitHub Desktop.
Save sunmeat/adaff217aa5a55ecae3882a502e181b6 to your computer and use it in GitHub Desktop.
GC.Collect C# example
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