Сборщик мусора среды CLR (C#)

Сборщик мусора среды CLR (C#)

DailyDev

Всем привет! Сегодня у меня появилось свободное время и я решил написать пост про сборщик мусора в среде выполнения common language runtime (CLR). Если вы C++ разработчик то вам знакома ситуация когда вам необходимо следить за тем, чтобы программа высвобождала выделяемую память для объектов. Иногда на это может уходить много времени, так как вы можете случайно дважды удалить ссылку на объект, или же вы вовсе забыть освободить память. В любом случае на это уходит много времени, и вместо того чтобы сконцентрироваться на логике программы вы тратите время на выделяемую память. Исполнением кода в языках Java, C# и др. занимается так называемая виртуальная машина (в Java это JVM, в C# - CLR). Виртуальная машина позволяет снять многие задачи с программиста, например разработчику не нужно думать о высвобождении выделяемой памяти, так как за него все сделает так называемый сборщик мусора. Именно о нем мы сегодня и поговорим.

Динамическая память

Для начала следует понимать что происходит во время создания объекта. Когда вы пишите такую строчку:

MyClass obj = new MyClass();

С помощью ключевого слова new происходит выделение места для объекта в динамической памяти. Однако, если объект больше нами не используется, то его следует удалить. Как же виртуальная машина понимает когда следует высвободить память объекта? Она отслеживает все ссылки на этот объект, и если ссылок не остается (все ссылки = null). Напомню что из себя представляют ссылки.

MyClass obj = new MyClass();
MyClass obj2 = obj;

В данном случае мы создали лишь один объект obj, а obj2 является ссылкой на него.

Деструкторы

Также следует упомянуть про деструкторы. Деструктор - это специальный метод который вызывается при исчезновении объекта, он в отличии от конструктора, помечается тильдой (~) и не может иметь модификатора доступа (так как деструктор может вызвать только сборщик мусора). Вот как это выглядит.

class MyClass
{
    ~MyClass() // деструктор
    {

    }
    public MyClass() // конструктор
    {
        
    }
}

Также, вызов сборщика мусора можно инициировать в программе, вызвав статический метод Collect класса GC, который находиться в пространстве имен System.

Заключение

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

Полезные ссылки


Report Page