Сборка мусора (Garbage Collection, GC) .NET в C# - Учим Шарп #28
HTML-код
- Опубликовано: 24 авг 2024
- Сборка мусора (Garbage Collection, GC) .NET на примере языка программирования C#
На этом занятии мы узнаем, что такое сборщик мусора (garbage collector, gc) и он выполняет освобождение памяти, оберегая наши приложения от утечки. Узнаем, как выполняется сборка мусора (garbage collection), поколения (generation) объектов, а также придется чуть подробнее поговорить про ссылочные (reference type) и значимые (value type) типы, как они хранятся в памяти стека (stack) и управляемой кучи (heap). Изучим основные методы System.GC, такие как Collect, GetGeneration, GetTotalMemory и другие. Узнаем, что на самом деле делает оператор new.
-----------
ПОДПИШИСЬ на соцсети:
🔴 TELEGRAM: bit.ly/tg_code...
🔴 VK: bit.ly/vk_code...
🔴 INSTAGRAM: bit.ly/inst_co...
🔴 Яндекс Дзен: bit.ly/zen_cod...
🔴 FACEBOOK: bit.ly/fb_code...
🔴 TWITTER: bit.ly/twit_cod...
🔴 Мой блог: bit.ly/site_co...
-----------
ПОДДЕРЖИ развитие CODE BLOG:
💲 Донат: bit.ly/donate_...
💲 Спонсорство: bit.ly/patreon...
-----------
СМОТРИ мои обучающие курсы:
👉 УЧИМ ШАРП: bit.ly/cs_code...
👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #1: bit.ly/fit_cod...
👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #2: bit.ly/crm_cod...
👉 СТРУКТУРЫ ДАННЫХ: bit.ly/ds_code...
👉 АЛГОРИТМЫ СОРТИРОВКИ: bit.ly/sort_co...
👉 ОТВЕТЫ НА ВОПРОСЫ: bit.ly/faq_cod...
👉 IT ПЕРЕОЗВУЧКА: bit.ly/resound...
👉 НЕЙРОННАЯ СЕТЬ: bit.ly/ai_code...
👉 ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ: bit.ly/pattern...
👉 CODE REVIEW: bit.ly/review_...
👉 CLR via C#: bit.ly/clr_cod...
-----------
Кстати, меня зовут Шванов Вадим, и я профессиональный .NET разработчик с 2011 года и автор этого канала CODE BLOG. Я рассказываю про IT технологии и веду абсолютно бесплатный курс по языку C# с нуля. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP .NET, .NET Core, ASP.NET MVC, Unity, WPF, структуры данных и алгоритмы, с#, dotnet, паттерны проектирования, информатика, csharp, программное обеспечение и многое другое. Для меня важно не только показать практическое применение языка си шарп, но и объяснить основную идею и базовые понятия Computer Science. В качестве основного инструмента разработки используется Visual Studio c# и проекты на Visual c#. Если вам нравятся такие каналы как хауди хо, айти борода, Soer или ExtremeCode, то здесь вам точно понравится.
-----------
#codeblog #программирование #csharp #ityoutubersru #программист #разработка
На этом занятии мы узнаем, что такое сборщик мусора (garbage collector, gc) и он выполняет освобождение памяти, оберегая наши приложения от утечки. Узнаем, как выполняется сборка мусора (garbage collection), поколения (generation) объектов, а также придется чуть подробнее поговорить про ссылочные (reference type) и значимые (value type) типы, как они хранятся в памяти стека (stack) и управляемой кучи (heap). Изучим основные методы System.GC, такие как Collect, GetGeneration, GetTotalMemory и другие. Узнаем, что на самом деле делает оператор new.
Кстати, меня зовут Вадим, и я программист на языке C# уже больше 8 лет. Рассказываю про IT технологии и веду этот курс по языку C# с нуля под названием Учим Шарп. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP.NET, Core, MVC, Unity, WCF, WPF, структуры данных и алгоритмы обработки, паттерны проектирования и многое другое. Для меня важно не только показать практическое применение языка C#, но и объяснить основную идею и базовые понятия Computer Science. Уроки c# выходят два раза в неделю в понедельник и четверг в 20-00 по МСК. Курс csharp рассчитан на то, чтобы изучить программирование с нуля. Разработка ведется в IDE Visual Studio. Подписывайтесь, впереди еще много интересного.
Отдуши, бро. Смотрю в 23 году и всё равно доволен )
26:00, обьекты могут не сжиматься, алгоритм sweep, рассчитан на то, что если памяти достаточно, для размещения новых обьектов, то он будет использовать те очищенные и незанятые дырочки
27:00 о new, бесспорно, но к примеру структура тоже создается через new, но при этом располагается в стеке)
35:30 в куче есть списки свободных участков памяти, поэтому поиск их и занимает мин кол-во времени. Если ее не достаточно, gc выбежит сама
Отличный урок, большое спасибо!
Про собеседование очень интересно! Обязательно после курса и 2 интенсивов надо погуглить вопросы
Спасибо Сэр ! вы лучший!
В LOH обьекты попадают которые больше приблизительно 83 килобайт (>=85,000 bytes).
Крайне тяжело слушать, начинается предложение - тут же появляется какой то вася с глупым комментарием и на него надо отвлечься и ответить, затем еще два слова предложения - появляется петя и пете надо ответить. Отвечать нужно конечно, но МОЖЕТ - на глупые и несущественные вопросы не отвечать вообще а на вопросы по делу отвечать после каких то блоков инофмарции?
1:05:48 - Уважаемый, не в коем случае Я, "не умнечаю". Но для таких моментов, есть клёвая опция в Visual Studio, как "Профилировщик производительности" (Alt+F2). Там подробно можно посмотреть, как ваша программа грузит железо. Если Я конечно же не ошибаюсь) хорошего настроения, спасибо за видео) от меня 👍
Спасибо, очень доходчиво объяснено, что такое "ээээээ..." и когда его использовать.
41:04 вы хотели сказать, очищаются объекты первого поколения на которых нету ссылки, а остальные переходят во 2е поколение?
или все же объектам 1го поколения на которые не ссылаются
присваивается второе поколение ?
Бротишка, ты лучший, не хочешь попилить контент конкретно по. Net core?)
Если уже пилишь, то соре, не заметил, посмотрю ещё раз)
Кстати, про ресурсы для новичков, ещё habr есть, Microsoft dots(вроде так), и professor.web
Автор оговорился насчет размера больших объектов. Согласно документации майкрософта в большую кучу попадают объекты размером 85 000байт, т.е. 83Килобайта.
я смелый человек готовый на собеседование) но не сейчас) через месяц полтора точно)
Кстати инфа устарела про то, что приложение останавливается во время работы коллектора! На сколько мне известно, уже не останавливается
Да, работает в фоне
Много трепа не по теме и отвлечений. Про стэк и хип начинал раз 10, прерывался на комменты, на что-то еще, в итоге за 10 минут не мог связать 2 слов.
Даа, отвлечения достали, но помогло х1.5 😂
Когда чел посмотрел первые 15 минут и сделал вывод по всей трансляции
В новых версия вижуалки, программа не останавливается, кстати.
Музыка отвлекает, особенно когда смотришь на 1.5
Ты пытался создать свой яп?
Когда сказал "Йоу" - 25 лет
Если бы оно так работало...
Не помню рассказа про финализатор и интерфейс IDisposable в предыдущих уроках.
это отдельная тема на самом деле ) в CLR курсе эта тема будет рассматриваться подробно
спасибо большое =)
Всегда пожалуйста )
Извините но я так и не понял што делаэт диструктор (~) ???
Здравствуйте. Подскажите, пожалуйста, каким образом стэк отделяется от кучи физически? За счет чего стэк быстрее? Просто за счет упорядоченности?
И еще один вопрос. Значимые типы, которые объявляются внутри класса хранятся в стэке? Например С.Value. Понятно, что ссылка на класс есть в стэке, а где сама переменная Value? Спасибо
Stask и Heap. Оба этих хранилища находятся в оперативной памяти системы (RAM), но программно-аппаратный комплекс (процессор + операционная система + библиотеки .NET) работают с этими областями памяти по-разному. Cтек намного быстрее кучи. Причина в том, каким образом выделяется стек - простым назначением указателя стека (единственная команда ассемблера). В отличие от стека куча обслуживается программно, с помощью специальных вызовов API операционной системы или библиотек. Кроме того, при интенсивном использовании кучи некоторые языки, использующие автоматический сбор мусора (например, Java, C# .NET), могут вводить не прогнозируемые дополнительные задержки при выполнении кода в реальном времени.
Спасибо. Стало немного яснее)
++
На 40й минуте когда подводите итоги про поколения, правильно ли я понял:
поколение 0
поколение 1
поколение 2
if(памяти не хватает)
{
вызывается Garbage Collection;
foreach( делает проход по поколеню 0)
{
if(ссылка на объект есть)
{
объекту присваивается поколение 1;
происходит фрагментация малых объектов;
}
else
{
ссылка на объект удаляется;
}
}
if(памяти хватает)
{
GC прекращает работу;
}
else
{
foreach(делает проход по поколению 1)
{
if(ссылка на объект есть)
{
объекту присваивается поколение 2;
происходит фрагментация малых объектов;
}
else
{
поколение объекта понижается на 1;
снова GC делает проход по поколению 0;
// с проверками
// и если после всего этого памяти снова не хватает то тогда с поколение 2 происходит всё тоже что и с поколением 1
}
}
}
}
Не совсем. Поколение объекта не понижается. Упорядочивание объектов производится перед завершением работы сборщика мусора.
@@CODEBLOG спасибо за ответ!
Какой ты нудный. И постоянно теряешь тему.