Сборщик мусора (GC) — это диспетчер памяти. Многие языки программирования имеют встроенный GC. Эта функция автоматически выделяет и освобождает память в программе. Он освобождает связанную, неиспользуемую память, которая замедляет работу вашего приложения.
Прелесть сборщика мусора в том, что он освобождает память от вашего имени, и вам не нужно ничего делать. Поэтому вы можете считать это настолько важной функцией, что ожидаете, что она будет в каждом языке программирования. К сожалению, это не так; даже в таком популярном языке, как C, может отсутствовать сборщик мусора.
Как работает распределение памяти?
Когда вы запускаете программу на любом языке программирования, ваша операционная система резервирует стек данных в памяти для этой программы. Эта программа владеет и занимает этот стек данных, пока не завершит выполнение. Если вашей программе требуется больше памяти, чем доступно, она может динамически выделять больше памяти из кучи памяти операционной системы.
В программировании переменная представляет ячейку памяти. Итак, когда вы объявляете новую переменную, язык программирования выделяет место в памяти для этой переменной. Теперь переменная будет иметь адрес памяти. Пока вы не присвоите значение этой переменной, она останется неинициализированной и может содержать какое-то мусорное значение.
Если язык программирования позволяет вам объявлять переменную без ее инициализации, то это динамическая переменная. Это означает, что значение, которое вы присваиваете переменной, может меняться со временем. Однако расположение переменной в памяти останется прежним, пока вы не освободите ее.
Как работает освобождение памяти?
Выделение памяти — аналогичный процесс для всех языков программирования. Но соответствующий метод освобождения памяти имеет тенденцию отличаться. Существует два типа методов освобождения памяти; ручной и автоматический. Сборщик мусора выполняет автоматическое освобождение.
Освобождение памяти без сборщика мусора
язык программирования С не использует GC для освобождения памяти. Поэтому программисты на C должны вручную выделять и освобождать память. C допускает динамическое выделение памяти, когда вы не знаете во время компиляции, сколько памяти вы будете использовать во время выполнения.
Стандартная библиотека (stdlib.h) содержит функции, которые C использует для управления динамическим выделением памяти. Эти функции включают в себя:
- malloc(): выделяет определенный размер памяти и возвращает указатель на эту память. Если в пуле памяти операционной системы недостаточно памяти, возвращается значение null.
- free(): освобождает определенный блок памяти и возвращает его в пул памяти операционной системы.
Пример программы на С
#включают
#включаютинтглавный()
{
инт *птр; // объявить указатель
инт дж; // объявляем счетчик// выделить место для 200 целых чисел
птр = (инт *) маллок(200 * размер(инт));// вставляем целочисленные значения в выделенную память
// и вывести каждое значение в консоль
за (j = 0; Дж < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// освобождаем ранее выделенную память
свободно(птр);
возвращаться0;
}
Приведенный выше код выделяет память для хранения 200 целочисленных значений с помощью маллок() функция. Он использует указатель для доступа к этой ячейке памяти и хранит в ней 200 целочисленных значений. Указатель также выводит на консоль данные, хранящиеся в ячейке памяти. Наконец, программа освобождает ранее выделенную память, используя свободно() функция.
Освобождение памяти с помощью сборщика мусора
Несколько популярных языков программирования используют GC для управления памятью. Это значительно облегчает жизнь программистам, использующим эти языки. C# и Java — это два языка программирования, в которых используется сборщик мусора.
Сборщик мусора С#
в Язык программирования С#GC управляет выделением и освобождением адресов памяти. Поэтому программисту на C# не нужно беспокоиться об освобождении объекта после того, как он выполнит свою задачу.
C# GC инициализирует пул памяти, называемый управляемой кучей, для каждого нового процесса (или программы). Он называет Виртуаллок() функция выделения памяти и ВиртуальныйБесплатный() функция, чтобы освободить его. Самое приятное то, что все это происходит в фоновом режиме без каких-либо усилий с вашей стороны, как программиста.
Сборщик мусора C# имеет механизм оптимизации, который используется для принятия решения о том, когда освобождать память. Механизм оптимизации проверяет корень приложения, чтобы определить, какие объекты больше не используются. Это достигается путем создания графа, который простирается от корня приложения до связанных объектов. Этот корень включает в себя статические поля, локальные переменные и т.д. Любой объект, не связанный с корнем приложения, является мусором.
Механизм оптимизации GC не просто самостоятельно собирает память. Сначала должен быть новый запрос на выделение памяти. Если в системе мало доступной памяти, в дело вступает механизм оптимизации GC.
Сборщик мусора Java
В Java сборщик мусора также управляет выделением и освобождением адресов памяти. Однако в настоящее время в Java поддерживаются четыре разных типа сборщиков мусора:
- Мусор-сначала (G1)
- Серийный
- Параллельно
- Сборщик мусора Z (ZGC)
Сборщик мусора G1 является GC по умолчанию в Java с момента выпуска Java Development Kit (JDK) 9. Java организует данные в объекты и хранит эти объекты в куче фиксированного размера. Сборщик мусора G1 делит кучу на области кучи одинакового размера. Затем он разделил эти области кучи на две части; молодое и старое поколения.
Каждый раз, когда вы создаете новый объект, выделение пространства для этого объекта происходит в молодом поколении. Используя процесс старения, сборщик мусора G1 копирует объекты из молодых регионов в старые регионы. Он также копирует объекты, которые уже находятся в старом регионе, в более старый регион.
Затем сборщик мусора G1 выполняет большую часть освобождения памяти в молодом поколении, время от времени заходя в раздел старого поколения.
Каковы преимущества наличия сборщика мусора?
Преимущество сборщика мусора заключается в том, что он не позволяет вам думать об управлении памятью при написании кода. Это дает вам время сосредоточиться на других важных аспектах вашего приложения. Однако стоит выделить ряд других преимуществ.
Восстановление неиспользуемых объектов и освобождение памяти обеспечивает более чистое выполнение приложения. Если ваша программа освобождает память как можно быстрее, она занимает меньше памяти и может работать более эффективно.
Сборка мусора уменьшает количество ошибок, связанных с управлением памятью, таких как утечки и ошибки указателей. Это связано с тем, что процесс больше не зависит от программиста и его способности писать точный код.